Linux下基於socket和多執行緒的聊天室小程式

2021-08-28 06:43:08 字數 2277 閱讀 8262

要求:基於tcp編寫,乙個聊天室最多100人。

客戶端:

1、使用者需要登入,登入時只需要輸入乙個暱稱即可無需判斷暱稱是否重複(如果其他功能都ok考慮)

2、使用者登入後連線伺服器端,進入聊天室

3、使用者可以輸入聊天資訊,也可以收到別人的聊天資訊。

4、使用者可以用某個特殊單詞代表退出聊天室。

額外功能:可以考慮實現tcp的檔案傳輸。

server.c

#include #include #include #include #include #include #include #include int sockfd;//伺服器socket

int fds[100];//客戶端的socketfd,100個元素,fds[0]~fds[99]

int size =100 ;//用來控制進入聊天室的人數為100以內

char* ip = "192.168.10.143";

short port = 10222;

typedef struct sockaddr sa;

void init()

struct sockaddr_in addr;

addr.sin_family = pf_inet;

addr.sin_port = htons(port);

addr.sin_addr.s_addr = inet_addr(ip);

if (bind(sockfd,(sa*)&addr,sizeof(addr)) == -1)

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

}void sendmsgtoall(char* msg)

}}void* service_thread(void* p);

if (recv(fd,buf,sizeof(buf),0) <= 0)

}printf("退出:fd = %dquit\n",fd);

pthread_exit((void*)i);

}//把伺服器接受到的資訊發給所有的客戶端

sendmsgtoall(buf);

}}void service()

int i = 0;

for (i = 0;i < size;i++)

if (size == i)}}

}int main()

client.c

#include #include #include #include #include #include #include #include int sockfd;//客戶端socket

char* ip = "192.168.10.143";//伺服器的ip

short port = 10222;//伺服器服務埠

typedef struct sockaddr sa;

char name[30];

void init()

printf("客戶端啟動成功\n");

}void start();

sprintf(buf2,"%s進入了聊天室",name);

send(sockfd,buf2,strlen(buf2),0);

while(1);

scanf("%s",buf);

char msg[131] = {};

sprintf(msg,"%s:%s",name,buf);

send(sockfd,msg,strlen(msg),0);

if (strcmp(buf,"bye") == 0)

}close(sockfd);

}void* recv_thread(void* p);

if (recv(sockfd,buf,sizeof(buf),0) <= 0)

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

}}int main()

剛開始,我宣告的那個全域性陣列int fds[99],它是有99個元素,fds[0]~fds[98],我以為是到fds[99],結果陣列越界,向fds[99]指向的未知檔案描述符發了個資料,而fds[99]指向的是監視程序的,向它發任何資料,程序都會莫名奇妙的終止。於是,伺服器莫名奇妙的掛掉了,朋友用gdb除錯,才發現program received signal sigpipe, broken pipe.這個問題我自己看了一天半也沒發現,最後還是在群裡面,別人幫提出來的,感悟有以下幾點:

1、linux下寫程式,也有除錯工具gdb,要學會使用,程式出錯了,如果看不出來,就可以來除錯;

2、程式設計師不是一直埋頭寫程式就行了,還是要多和別人交流,一切以解決問題為根本。

linux下socket和window下區別

socket相關程式從windows移植到linux下需要注意的 1 標頭檔案 windows下winsock.h winsock2.h linux下sys socket.h 錯誤處理 errno.h 2 初始化 windows下需要用wsastartup linux下不需要 3 關閉socket ...

Windows和Linux下socket的區別

1.標頭檔案 windows下winsock.h或winsock2.h linux下netinet in.h 大部分都在這兒 unistd.h close函式在這兒 sys socket.h 在in.h裡已經包含了,可以省了 2.初始化 windows下需要用wsastartup啟動ws2 32.l...

windows和linux下socket程式設計的不同

windows windows 標頭檔案的區別 include include windows 初始化的區別 windows 宣告socket socket型別 windows socket關閉 closesocket windows socket操作錯誤返回值 socket error windo...