用C語言在WIN32下編譯簡單的聊天程式,客戶端向伺服器發訊息,伺服器接到訊息後會返回

時間 2021-10-14 21:29:01

1樓:_夢幻陽光

#include#include

#include

#include

#include

#include

#include

#define serverport 5555#define backlog 10

#define maxlen 1024

int main();

struct sockaddr_in my_addr;

struct sockaddr_in cli_addr;

int iret;

/*建立socke通訊*/

if((sockfd = socket(af_inet,sock_stream,0)) == -1)

printf("socket success\n");

my_addr.sin_family=af_inet; my_addr.sin_port=htons(serverport);

my_addr.sin_addr.s_addr=inaddr_any;

memset(my_addr.sin_zero,0,8);

/*繫結socket埠*/

if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr)) == -1)

printf("bind success\n");

/*監聽埠*/

if(listen(sockfd,backlog) == -1)

printf("listren success\n");

while(1)

printf("accept success\n");

printf("receive a connection form %s\n",inet_ntoa(cli_addr.sin_addr));

/*fork程序,子程序處理接收的資訊*/

iret=fork();

if(iret < 0)

/*fork返回0,為子程序*/

else if(iret == 0)

printf("recvlen[%d]\n",recvlen);

printf("recvmsg:\n%s\n",recvbuf);

/*向客戶端傳送內容*/ if(send(client_fd,recvbuf,recvlen,0) == -1)

printf("sendmsg:\n%s\n",recvbuf);

close(client_fd);

exit(0);

} /*父程序,返回子程序pid*/

else }

close(sockfd);

exit(0);}

2樓:冰是沉默的水

好厲害的樣子,完成了可以給我**麼!我也想看看!

3樓:

可以給我一份嗎?謝謝,[email protected]

c語言socket程式設計要怎麼實現伺服器可以發訊息給客戶端?

4樓:love添飯

先要理解

來socket是什麼?

簡單的說socket是一

自個全雙工的通訊通道,bai

即使用dutcp或者udp通訊時均可zhi以在傳送訊息的同時接受消dao

息,它不區分是否是伺服器。

根據這個概念你的問題就很好回答。

》當客戶端與伺服器連線後。有什麼方法使伺服器可以隨時隨地發訊息給客戶端?

》我現在只能。客戶端發個訊息給伺服器。伺服器才能發個訊息給客戶端。也就是說客戶端不發訊息。伺服器就沒法發訊息給客戶端。

》求大牛給個思路。當連線後。客戶端與伺服器雙方可以隨時隨地通訊!

使用多執行緒,一個維持接受邏輯,一個維持送信邏輯,即可完成同時接受及傳送。

客戶端及伺服器端均做上述設定。

而你的做法是在一個執行緒中執行接受與送信,因此只能按照順序邏輯完成接收與送信。

關鍵點是多執行緒。

5樓:匿名使用者

繫結兩個埠,一個專門傳送,一個專門接收

如何用c語言編寫一個簡單的聊天室程式

6樓:頂起石頭的小草

你好!是dos下的聊天程式嗎

c語言socket伺服器怎麼給客戶端發訊息

7樓:匿名使用者

socket 伺服器給指定的客戶端發訊息該怎麼處理(tcp)(c語言)

多個客戶端之間進行通訊,通過伺服器**的形式,現在客戶端1請求向客戶端2傳送訊息,先把訊息傳送到伺服器,伺服器怎麼才能把訊息**到客戶端2而不是**給客戶端3或者他自己。

8樓:山成褒庚

最好的方法是:每一客戶端用唯一的id來標示,就像qq號一樣,

在客戶端連線伺服器,傳送自己的id,

然後和相應產生的socket進行繫結,

一個客戶端向另一個客戶端傳送資訊時,要求在資料包裡包含對方的id號。可以定義一個型別下列的資料結構對資料包進行封裝:

type

struct

_sdata

sdata,

*psdata;

9樓:騎富貴容嫻

你的檔案中的問題

//會阻塞程序,直到有客戶端連線上來為止

//既然是直到有客戶端連線上,那麼就要弄明白哪個是與客戶端連線的套接字//

sockclient就是與客戶端連線的套接字sockclient

=accept(sockserver,

(sockaddr*)&addrclient,&len);

//接收並列印客戶端資料

recv(sockclient,

recvbuf,

100,

0);printf("%s\n",

recvbuf);

//所以此處,應該把sockserver改為sockclientsend(/*sockserver*/sockclient,sendbuf,

100,

0);ps:伺服器客戶端通訊,是要保持伺服器與客戶端的連線。

而不能這樣立即關閉,如果設定不對,立即關閉,緩衝區的資料是會丟失的。那客戶端也就不會再收到資料了。

你可以加sleep(10000);來測是通訊過程//關閉socket

closesocket

(sockclient);

c語言socket程式設計,伺服器和一個客戶端連線時,伺服器能正常收到資訊,2個以上就出現bug了 100

10樓:

設定監聽socket的listen呢?

執行緒有自己的私有棧,即區域性變數

編寫一個簡單的tcp通訊程式。伺服器傳送“你好我是伺服器”,客戶端接收該資訊並顯示在螢幕上。用j**a寫

採用tcp協議,使用socket程式設計,編寫程式完成客戶端傳送訊息給服務端,服務端接到訊息後,再發

11樓:樹大沒風

服務端**:

/*server.c*/

#include

#include

#include

#include

#include

#include

#include

#include

#define port 4321

#define buffer_size 1024

#define max_que_conn_nm 5

int main()

printf("socket id = %d\n",sockfd);

/*設定sockaddr_in 結構體中相關引數*/

server_sockaddr.sin_family = af_inet;

server_sockaddr.sin_port = htons(port);

server_sockaddr.sin_addr.s_addr = inaddr_any;

bzero(&(server_sockaddr.sin_zero), 8);

int i = 1;/* 使得重複使用本地地址與套接字進行繫結 */

setsockopt(sockfd, sol_socket, so_reuseaddr, &i, sizeof(i));

/*繫結函式bind*/

if (bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr))== -1)

printf("bind success!\n");

/*呼叫listen函式*/

if (listen(sockfd, max_que_conn_nm) == -1)

printf("listening....\n");

/*呼叫accept函式,等待客戶端的連線*/

if ((client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size)) == -1)

/*呼叫recv函式接收客戶端的請求*/

memset(buf , 0, sizeof(buf));

if ((recvbytes = recv(client_fd, buf, buffer_size, 0)) == -1)

printf("received a message: %s\n", buf);

if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1)

close(sockfd);

exit(0);

} 客戶端:

/*client.c*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define port 4321

#define buffer_size 1024

int main(int argc, char *ar**)

/*地址解析函式*/

if ((host = gethostbyname(ar**[1])) == null)

memset(buf, 0, sizeof(buf));

sprintf(buf, "%s", ar**[2]);

/*建立socket*/

if ((sockfd = socket(af_inet,sock_stream,0)) == -1)

/*設定sockaddr_in 結構體中相關引數*/

serv_addr.sin_family = af_inet;

serv_addr.sin_port = htons(port);

serv_addr.sin_addr = *((struct in_addr *)host->h_addr);

bzero(&(serv_addr.sin_zero), 8);

/*呼叫connect函式主動發起對伺服器端的連線*/

if(connect(sockfd,(struct sockaddr *)&serv_addr, sizeof(struct sockaddr))== -1)

/*傳送訊息給伺服器端*/

if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1)

if ((recvbytes = recv(sockfd, buf, buffer_size, 0)) == -1)

close(sockfd);

exit(0);}

win32程式建立執行緒用c語言庫的 beginthread還

beginthread就是把createthread寫成了乙個函式,createthread是windows的api beginthread是c語言的內建函式.若說使用哪個,都是可以使用的,看個人愛好,還有結束執行緒的不同。一般來說使用 beginthread安全結束執行緒簡單些 建議使用 begi...

用C語言編簡單的數學計算程式要求輸入題目數

include include include void main int a,b,i,op,r,c 0 c表示答對題目數,r記錄回答結果 int n,s printf 您希望出多少道題目 n scanf d n s n while n srand time 0 a rand 10 1 b rand...

怎樣用C語言編寫DOS下的中斷服務程式

keys.cpp 按鍵表索引發 首先建立key table作為按鍵表,然後根據按鍵掃描碼改變key table中的狀態,這樣key table中所有對應的索引按鍵即為需要的組合鍵。以下程式僅對上 下 左 右四個游標鍵做了組合按鍵的處理。本程式在borland c 3.1 中除錯通過。include ...