#pragma comment(lib, "Ws2_32.lib")
#include <stdio.h> #include <WinSock2.h> #include <WS2tcpip.h> #include <process.h>
#define _LINK_PORT_ 8088 #define _BUFFER_LENGTH_ 512 #define _DEFAULT_PORT_ "12345"
//接受客户端消息的线程函数
unsigned __stdcall ThreadRecv(LPVOID param) { SOCKET ListenSocket = (SOCKET)param;
SOCKET sockClient = INVALID_SOCKET; printf("start accept...\n"); sockClient = accept(ListenSocket, NULL, NULL); printf("end accept...\n"); if(INVALID_SOCKET == sockClient) { printf("accept failed:%d\n", WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); return 1; }
char recvBuf[_BUFFER_LENGTH_] = {0}; int nRecv = 0; while( SOCKET_ERROR != nRecv) { nRecv = recv(sockClient, recvBuf, _BUFFER_LENGTH_, 0); printf("ClinetSocket=%d, received count=%d\n", sockClient, nRecv); if(SOCKET_ERROR == nRecv) { //标记当前线程为有信号
_endthreadex(0); printf("recv failed! current thread's state is signaled! error=%d, clientsocket=%d", WSAGetLastError(), sockClient); } }
//关闭Socket
printf("ClientSocket=%d, thread closing...\n", sockClient); shutdown(sockClient, SD_BOTH); closesocket( sockClient ); return 0; }
int main() { struct addrinfo *result = NULL, *ptr = NULL, hints; int iResult;
//Initialize winsocket
WSADATA wsaData; iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_IP; hints.ai_flags = AI_PASSIVE;
//Resolve the local address and port to be used by the server;
iResult = getaddrinfo(NULL, _DEFAULT_PORT_, &hints, &result); if(iResult != 0) { printf("getaddrinfo failed: %d\n", iResult); WSACleanup(); return 1; }
//Create a SOCKET for the server to listen for client connections
SOCKET ListenSocket = INVALID_SOCKET; ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); if(INVALID_SOCKET == ListenSocket) { printf("Error at socket(): %d\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return 1; }
//Setup the TCP listening socket
iResult = bind(ListenSocket, result->ai_addr, result->ai_addrlen); if(iResult == SOCKET_ERROR) { printf("bind failed: %d\n", WSAGetLastError()); freeaddrinfo(result); closesocket(ListenSocket); WSACleanup(); return 1; }
//Listen connection
if(listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR) { printf("Error at bind():%d \n", WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); return 1; }
while(true) { SOCKET sockClient = INVALID_SOCKET;
unsigned threadId; HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &ThreadRecv,(void*)ListenSocket, 0, &threadId);
printf("waitting for ClinetSocket to finish...\n"); WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); } WSACleanup();
return 0; } |