socket编程花了我三四天的事件终于将这个程序给实现了
所谓的多人聊天室,其实不过是客户端创建一个数据接收线程和数据发送线程,而在服务器端创建一个套接字数组,开启一个接受连接请求线程,不断接受来自客户端的连接请求,然后将建立的连接所形成的新套接字描述符存进套接字数组,并针对所存储的套接字描述符建立多个数据接收线程,对于所接收到的数据,开启一个数据转发进程,对套接字数组中的每个客户端将收到的数据进行转发。服务器就是起到这个一个数据转发的功能。
附上代码
客户端:
#include <stdio.h> #include <winsock2.h> #include <pthread.h> #pragma comment(lib,"ws2_32.lib") char buffer[4096] = {0}; int iRecvLen = 0; int iSnedLen = 0; char name[20]; void THRE_RECV(SOCKET ClientSocket) { char buffer[50]={0}; while(1) { memset(buffer, 0, sizeof(buffer));///接收消息 iRecvLen = recv(ClientSocket, buffer, sizeof(buffer), 0); if (SOCKET_ERROR == iRecvLen) { printf("send failed with error code: %d\n", WSAGetLastError()); closesocket(ClientSocket); WSACleanup(); return -1; } ///printf("recv %d bytes from %s: ", iRecvLen, nameOther);//为了美观最好不要打印这个了 //strcat(buffer, "\0"); buffer[iRecvLen] = 0; printf("\n%s\n", buffer); } } int main() { WSADATA wsaData = { 0 };///存放套接字信息,WSADATA结构被用来保存AfxSocketInit函数返回的WindowsSockets初始化信息。 SOCKET ClientSocket = INVALID_SOCKET;///客户端套接字 ///printf("%d\n",INVALID_SOCKET); SOCKADDR_IN ServerAddr = { 0 };///服务端地址 USHORT uPort = 18000;///服务端端口 ///初始化套接字 if(WSAStartup(MAKEWORD(2,2), &wsaData))///该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本 ///第二个参数返回请求的socket版本信息 { printf("WSAStartup failed with error code: %d\n", WSAGetLastError()); return -1; } ///判断套接字版本 if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { printf("wVersion was not 2.2\n"); return -1; } ///创建套接字 ClientSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);///AF_INET代表一个地址族,SOCK_STREAM表示为TCP协议的流服务,IPPROTO_TCP的值为6 ///printf("%d\n",IPPROTO_TCP); if (ClientSocket == INVALID_SOCKET) { printf("socket初始化失败并返回错误代码: %d\n", WSAGetLastError()); return -1; } ///输入服务器IP printf("Please input the server's IP:&#