服务器端对一个客户端来了就开启一个工作线程,最多可接受64个。
具体看代码:
#pragma once #include <winsock.h> #include <stdio.h> #pragma comment(lib, "ws2_32.lib") #define MaxClient 64 class MyTCPSocket { public: MyTCPSocket(void); ~MyTCPSocket(void); bool Init(); bool UnInit(); bool CreateSocket(); bool Bind(unsigned aPost,const char* aAdress); bool Listen(int aBacklog=5); bool Connect(unsigned aPost,const char* aAdress); bool Send(const char* aBuf); bool Recv(); void Accept(); static DWORD WINAPI WorkerFun(PVOID aData); public: SOCKET m_ClientSocket[MaxClient]; private: SOCKET m_Socket; sockaddr_in m_SockClientaddrIn ; HANDLE m_ClientHandle[MaxClient]; CRITICAL_SECTION m_CriticalSection; DWORD m_Thread[MaxClient]; int m_TotClient; }; #include "MyTCPSocket.h" struct Para { MyTCPSocket* m_pMyTCPSocket; SOCKET m_CurSocket; }; MyTCPSocket::MyTCPSocket(void) :m_Socket(INVALID_SOCKET) , m_TotClient(-1) { InitializeCriticalSection(&m_CriticalSection); } MyTCPSocket::~MyTCPSocket(void) { EnterCriticalSection(&m_CriticalSection); for (int i =0; i < m_TotClient;++i) { if (NULL != m_ClientHandle[i]) { CloseHandle(m_ClientHandle[i]); } } LeaveCriticalSection(&m_CriticalSection); DeleteCriticalSection(&m_CriticalSection); } bool MyTCPSocket::Init() { int iResult; WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 2); iResult = WSAStartup(wVersionRequested, &wsaData); if (iResult != 0) { printf("WSAStartup failed with error: %d ", iResult); return false; } else { printf("WSAStartup succeeded! "); return true; } } bool MyTCPSocket::CreateSocket() { m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET == m_Socket) { printf("INVALID_SOCKET "); return false; } printf("Create Socket(%d) successully. ",m_Socket); BOOL reuseaddr=TRUE; setsockopt(m_Socket,SOL_SOCKET,SO_REUSEADDR,(const char*)&reuseaddr,sizeof(reuseaddr)); return true; } bool MyTCPSocket::Bind(unsigned aPost,const char* aAdress) { struct sockaddr_in server_addr; // server address information server_addr.sin_family = AF_INET; // host byte order server_addr.sin_port = htons(aPost); // short, network byte order server_addr.sin_addr.s_addr = inet_addr(aAdress); // automatically fill with my IP memset(server_addr.sin_zero, '