头文件 InitServerSocket.h
```
#pragma once
class CInitServerSocket
{
public:
CInitServerSocket();
~CInitServerSocket();
CInitServerSocket(USHORT nPort, char * szIpAddr);
private:
// //端口号
USHORT m_nPort;
SOCKET m_sSocket;
char *m_szIpAddr;`这里写代码片`protected:
bool InitSocket();
private:
bool SelectFrm();
public:
virtual bool HandRecv(SOCKET sSocket, char * pszRecv) = 0;
};
void ShowNetworkError(const char *szDetail);
#include "stdafx.h"
#include "InitSocket.h"
#pragma warning(disable:4996)CInitServerSocket::CInitServerSocket(): m_szIpAddr(NULL)
{
}CInitServerSocket::~CInitServerSocket()
{WSACleanup();
}bool CInitServerSocket::InitSocket()
{m_sSocket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (INVALID_SOCKET == m_sSocket){ShowNetworkError("Create sListen");return false;}SOCKADDR_IN saiServer;saiServer.sin_family = AF_INET;saiServer.sin_port = htons(m_nPort);saiServer.sin_addr.S_un.S_addr = (m_szIpAddr == NULL ? INADDR_ANY : inet_addr(m_szIpAddr));if (SOCKET_ERROR == ::bind(m_sSocket, (LPSOCKADDR)&saiServer, sizeof(saiServer))){ShowNetworkError("bind sListen");return false;}if (SOCKET_ERROR == ::listen(m_sSocket, 5)){ShowNetworkError("Listen");return false;}
}void ShowNetworkError(const char *pszDetail)
{DWORD dwError = GetLastError();HLOCAL hLocal = NULL;FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL, dwError, MAKELANGID(LANG_CHINESE_SIMPLIFIED, SUBLANG_CHINESE_SIMPLIFIED),(TCHAR *)&hLocal, 0, NULL);if (!hLocal){printf("%s Error:\n", pszDetail);printf("Error No. %d: dwError");printf("Error Info %s \n", LocalLock(hLocal));}
}CInitServerSocket::CInitServerSocket(USHORT nPort, char * szIpAddr = NULL)
{WSADATA wd;WSAStartup(MAKEWORD(2, 2), &wd);m_nPort = nPort;m_szIpAddr = m_szIpAddr;InitSocket();
}bool CInitServerSocket::SelectFrm()
{fd_set fdSocket;FD_ZERO(&fdSocket);FD_SET(m_sSocket, &fdSocket);while (true){fd_set fdRead = fdSocket;int nRet = select(0, &fdRead, NULL, NULL, NULL);if (nRet > 0){for (int i = 0; i .fd_count; i++){if (FD_ISSET(fdSocket.fd_array[i], &fdRead)){if (fdSocket.fd_array[i] == m_sSocket){if (fdSocket.fd_count > FD_SETSIZE){printf("Too Much Connect\n");}else{SOCKADDR_IN sai;int nLen = sizeof(sai);SOCKET sNew = accept(m_sSocket, (LPSOCKADDR)&sai, &nLen);if (INVALID_SOCKET == sNew){ShowNetworkError("Accept");continue;}else{printf("收到(%s)的连接\n", inet_ntoa(sai.sin_addr));FD_SET(sNew, &fdSocket);}}}else{char szBuf[255] = "";int nRecv = recv(fdSocket.fd_array[i], szBuf, 255, 0);if (nRecv > 0){HandRecv(fdSocket.fd_array[i], szBuf);}else{closesocket(fdSocket.fd_array[i]);FD_CLR(fdSocket.fd_array[i], &fdSocket);}}}}}}return TRUE;
}