需求分析:能支援對個使用者同時聊天,實現群聊功能;
方法分析:採用多執行緒處理方式。不同的客戶端開啟不同的工作執行緒,共享同一程序的記憶體資訊。服務端**某一客戶端傳送的資訊給其他客戶端,實現資訊實時共享。
服務端**:
# server.c
#include #include #include #include #include #include #include #include #include #include #include #define maxline 1000 //在一條訊息中最大的輸出字元數
#define listenq 20 //最大監聽佇列
#define port 5000 //監聽埠
void *get_client(void *);
int sockfd,i;
static int maxi=0;//maxi表示當前client陣列中最大的使用者的i值
static int client[maxfd];
void recvandsend(void) //監聽**執行緒入口函式
pthread_exit(null);}
int main(int argc, char *ar**)
/* 伺服器端開始建立 socket 描述符 */
if((sockfd=socket(af_inet,sock_stream,0))==-1)
/* 伺服器端填充 sockaddr 結構 */
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=af_inet;
server_addr.sin_addr.s_addr=htonl(inaddr_any);
server_addr.sin_port=htons(port);
/* ** sockfd 描述符 */
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
printf("伺服器監聽埠%d...\n",port);
/* 監聽 sockfd 描述符 */
if(listen(sockfd,listenq)==-1)
thr_id =pthread_create(&p_thread, null, recvandsend, null);
printf("歡迎來到本聊天室\n");
while(1)
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)
/*fprintf(stderr,"serverget connection from %s\n",inet_ntoa(client_addr.sin_addr));*/
client[maxi++]=new_fd;
printf("\n新使用者進入聊天室%d\n",new_fd);
}close(sockfd);
exit(0);
}
客戶端**:
#include #include #include #include #include #include #include #include #include #include #include #define true 1
#define port 5000
static int sockfd;
void* recvfromserver() //接受伺服器訊息執行緒入口函式
}pthread_exit(null);
return null;
}int main(int argc, char *ar**)
printf("請輸入伺服器ip位址\n");
scanf("%s",strhost);
if((host = gethostbyname(strhost)) == null)
/* 客戶程式開始建立 sockfd 描述符 */
printf("正在建立套介面...\n");
if((sockfd = socket(af_inet,sock_stream,0)) == -1)
/* 客戶程式填充服務端的資料 */
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=af_inet;
server_addr.sin_port=htons(port);
server_addr.sin_addr=*((struct in_addr *)host->h_addr);
printf("套介面建立成功,正在鏈結伺服器...\n");
/* 客戶程式發起連線請求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
/* 連線成功了 */
printf("請輸入你的使用者暱稱\n");
scanf("%s",clientname);
// write(sockfd,clientname,sizeof(clientname));
printf("\n\n開始聊天吧(\"quit\"斷開連線)\n\n");
thr_id = pthread_create(&p_thread, null, recvfromserver, null);
while(1)
if(strcmp(buffer,"quit")==0)
}/* 結束通訊 */
close(sockfd);
exit(0);
}
# client.c
#include #include #include #include #include #include #include #include #include #include #include #define true 1
#define port 5000
static int sockfd;
void* recvfromserver() //接受伺服器訊息執行緒入口函式
}pthread_exit(null);
return null;
}int main(int argc, char *ar**)
printf("請輸入伺服器ip位址\n");
scanf("%s",strhost);
if((host = gethostbyname(strhost)) == null)
/* 客戶程式開始建立 sockfd 描述符 */
printf("正在建立套介面...\n");
if((sockfd = socket(af_inet,sock_stream,0)) == -1)
/* 客戶程式填充服務端的資料 */
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=af_inet;
server_addr.sin_port=htons(port);
server_addr.sin_addr=*((struct in_addr *)host->h_addr);
printf("套介面建立成功,正在鏈結伺服器...\n");
/* 客戶程式發起連線請求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
/* 連線成功了 */
printf("請輸入你的使用者暱稱\n");
scanf("%s",clientname);
// write(sockfd,clientname,sizeof(clientname));
printf("\n\n開始聊天吧(\"quit\"斷開連線)\n\n");
thr_id = pthread_create(&p_thread, null, recvfromserver, null);
while(1)
if(strcmp(buffer,"quit")==0)
}/* 結束通訊 */
close(sockfd);
exit(0);
}
網路程式設計之多客戶端
1 reuseaddr 1 為了解決time wait狀態下不能馬上重啟程式的問題,所以伺服器要設定reuseadda屬性。使用setsockopt進行設定 2 setsockopt原型 int setsockopt int sockfd,int level,int optname,void opt...
聊天室客戶端
from socket import import os,sys 傳送訊息 def send msg s,name,addr while true text input 發言 if text quit msg q name s.sendto msg.encode addr sys.exit 退出聊天...
WinSock多人聊天客戶端
使用winsock 使用codeblocks編譯 只要需要執行兩個客戶端,客戶端傳送訊息給服務端,服務端收到訊息後 給其他客戶端 參考 include include include include include conio.h include include include include de...