#include <Winsock2.h> #include <stdio.h> #include <windows.h> #include <string.h> DWORD WINAPI RecvProc( LPVOID lpParameter // thread data ); struct RECVPARAM { SOCKET sock; SOCKADDR_IN sockaddr; }; void main() { WORD wVersionRequseted; WSADATA wsaData; int err; wVersionRequseted = MAKEWORD(1, 1); err = WSAStartup(wVersionRequseted, &wsaData); if(err!=0) { return; } if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) !=1) { WSACleanup(); return; } SOCKET socketSrv = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(6000); bind(socketSrv, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR)); listen(socketSrv, 5); SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); HANDLE hRecvThread; RECVPARAM *pRecvParam=new RECVPARAM; printf("服务器启动\n"); while(1) { SOCKET sockConn = accept(socketSrv, (SOCKADDR*)&addrClient, &len); pRecvParam->sock=sockConn; pRecvParam->sockaddr = addrClient; hRecvThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL); } delete pRecvParam; } DWORD WINAPI RecvProc( LPVOID lpParameter // thread data ) { char recvBuf[200]; memset(recvBuf,0 ,200); SOCKET sockClient =((RECVPARAM*)lpParameter)->sock; SOCKADDR_IN addrClient = ((RECVPARAM*)lpParameter)->sockaddr; printf("%s 进入连接\n", inet_ntoa(addrClient.sin_addr)); while(TRUE) { if(!recv(sockClient, recvBuf, 200,0)) { printf("%s 客户端断开连接\n", inet_ntoa(addrClient.sin_addr)); break; } if(0==strcmp(recvBuf, "abc")) { send(sockClient, "thank you!", strlen("thank you!"), 0); closesocket(sockClient); break; } printf("%s\n", recvBuf); } printf("线程终止\n"); return 0; }