头文件 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 < fdSocket.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);
}
}
}//if (fdSocket.fd_array[i] == m_sSocket)
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;
}