資源簡介
這個程序是在window下用c編寫的socket基于多線程的程序,程序能夠完美運行,并且程序注解也是很清楚的哦!Liunx版本的c編寫的socket多線程的聊天室也是有的,程序中有可直接執行的exe文件方便大家測試。

代碼片段和文件信息
//加載頭文件
#include?
#include?
#include?
#pragma?comment(lib“ws2_32.lib“)
#include?
//定義一些常量
????#define?PORT?8585???
//輸入輸出的一些內容的字符長度
#define?MAX_SIZE?1000???
SOCKET?fd;//客戶端fd
//發送和接受的信息?
????char?sendbuf[1024];
????char?recvbuf[1024];
???SOCKET?create_connection(){
//創建socket?AF_INET是ipv4d?
SOCKET?socket_cliet?=?socket(AF_INET?SOCK_STREAM?IPPROTO_TCP);
//判斷是否可以創建socket?
if(socket?==?INVALID_SOCKET){
printf(“socket_cliet?創建失敗?\n“);
exit(1);//錯誤退出
}
//構造一個客戶端的地址
struct?sockaddr_in?client;??
//ipv4的地址
client.sin_family?=?AF_INET;?
client.sin_addr.s_addr?=inet_addr(“192.168.43.158“);?
client.sin_port?=?htons(PORT);?
//進行連接
if(connect(socket_cliet?(struct?sockaddr?*)&clientsizeof(struct?sockaddr))?==?SOCKET_ERROR){??
printf(“客戶端連接失敗,未找到服務器,請確保服務器先開啟\n“);?
//關閉socket?
closesocket(socket_cliet);
//退出程序?
exit(1);?
}??
???
???return?socket_cliet;
???}
???//這是一個線程處理的函數,用來接受服務器傳來的信息
????void?recvinfo(void*?ptr)
????{?
while(1)
{
//對信息進行處理清空?可以接受下一個內容
if?((recv(fdrecvbufMAX_SIZE0))==-1){?
printf(“服務器故障5555555555555555?已退出客戶端\n“);?
exit(1);?
}
//打印出該結束的信息
printf(“%s“recvbuf);
//清空緩存?
memset(recvbuf0sizeof(recvbuf));
????}
???}
????int?main()?
????{?
????
????//開啟socket服務的函數?
????WORD?sockVersion?=?MAKEWORD(2?2);
WSADATA?data;
if?(WSAStartup(sockVersion?&data)!=?0)
{
return?0;
}
????//進入的時候攜帶用戶名昵稱?默認為null?
//得到客戶端連接的socket
????fd=create_connection();
????//輸入name
?? char?*name=““;?
?? printf(“親愛的用戶名請輸入你的聊天室的姓名哦!\n“);
scanf(“%s“&name);
printf(“\n“);?
//正式進入聊天室?進入了之后的話就進行對服務器的連接完成了
????printf(“--------》親愛的客戶:%s?你已經成功進入聊天室《--------\n“&name);
????
????//接下來的操作就是?客戶端與服務器之間傳輸數據與接受數據?
//這里要使用一個非堵塞的io
//send信息和recv信息都是與服務器之間進行通信的,他們都是同步的函數
//都是堵塞的函數,如果用if來判斷,就直接獲得返回值也是可以,但是沒有實現出來
//然后就使用一個線程一直來接收信息,主線程也是main的線程就一直來發送信息
???
//這個recvinfo是接受服務器的信息
????_beginthread(recvinfo0NULL);
//這下是發送信息
????while(1)
????
????{ //發送之前清空內容
????????memset(sendbuf0sizeof(sendbuf));
//先把姓名輸入到這個集合中。
char?sendname[1222];
????????memset(sendname0sizeof(sendname));
char?*you=“??say:“;
strcat?(sendname&name);
strcat?(sendnameyou);
//stdin是標準終端輸入?fgets函數是顯示在終端上并且內容存入sendbuf中
//fflush(stdin);a
????????//s(sendbufsizeof(sendbuf)stdin);
????????scanf(“%s“&sendbuf);
????????strcat(sendnamesendbuf);
????????//memset(sendname0sizeof(sendname));
????????send(fdsendnamesizeof(sendname)0);
????????memset(sendbuf0sizeof(sendbuf));
????}
????closesocket(fd);
WSACleanup();
return?0;
?}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2018-12-01?17:19??c的socket服務器\
?????文件????????3142??2018-12-01?17:19??c的socket服務器\c.c
?????文件??????136256??2018-12-01?17:19??c的socket服務器\c.exe
?????文件????????3795??2018-12-01?11:58??c的socket服務器\s.c
?????文件??????136238??2018-12-01?12:29??c的socket服務器\s.exe
評論
共有 條評論