18,356
社区成员
发帖
与我相关
我的任务
分享
DWORD Flags = 0;
DWORD dwRecvBytes = 0;
WSARecv(xx, xx, 1, &RecvBytes, &Flags,xx, NULL)
HANDLE hCompletionPort;
WSADATA CWsaData;
SYSTEM_INFO CSystemInfo;
SOCKADDR_IN CLocalAddr;
SOCKET sListen;
unsigned int nLoop;
if (0 != WSAStartup(MAKEWORD(2,2), &CWsaData))
{
cout << "WSAStartup Failed" << endl;
return;
}
//创建一个IO完成端口
hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
//确定处理器的数量
GetSystemInfo(&CSystemInfo);
for (nLoop = 0; nLoop < CSystemInfo.dwNumberOfProcessors * 2; nLoop++)
{
//根据处理器的数量创建相应多的处理线程
HANDLE thread = CreateThread(NULL, 0, ServerThread, hCompletionPort, 0, NULL);
CloseHandle(thread);
}
//创建一个监听套接字(进行重叠操作)
sListen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
CLocalAddr.sin_family = AF_INET;
CLocalAddr.sin_addr.s_addr = htonl(INADDR_ANY);
CLocalAddr.sin_port = htons(9990);
if (0 != bind(sListen, (PSOCKADDR)&CLocalAddr, sizeof(CLocalAddr)))
{
cout << "bind addr failed: " << WSAGetLastError() << endl;
return;
}
if (0 != listen(sListen, SOMAXCONN))
{
cout << "listen failed: " << WSAGetLastError() << endl;
return;
}
while (1)
{
SOCKET NewSocket = accept(sListen, NULL, NULL);
if (INVALID_SOCKET == NewSocket)
{
printf("socket accept failed:%d\n", WSAGetLastError());
continue;
}
LPCONNECT_INFO lpNewConn = new CONNECT_INFO();
memset(lpNewConn->cRecvBuffer, sizeof(lpNewConn->cRecvBuffer), 0);
memset(lpNewConn->cSendBuffer, sizeof(lpNewConn->cSendBuffer), 0);
lpNewConn->sSocketToRecv = NewSocket;
lpNewConn->sSocketToSend = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
strcpy(lpNewConn->cRemoteServerIp, REMOTE_SERVER_IP);
lpNewConn->wRemoteServerPort = REMOTE_SERVER_PORT;
LPPER_IO_DATA lpIOData = new PER_IO_DATA();
lpIOData->nSocketType = CLIENT_SOCKET;
lpIOData->nOperatorType = RECV;
lpIOData->OperatorBuf.buf = (char*)lpNewConn->cRecvBuffer;
lpIOData->OperatorBuf.len = 1000;
memset(&(lpIOData->COverlapped), 0, sizeof(OVERLAPPED));
DWORD dwFlags;
if (WSARecv(lpNewConn->sSocketToRecv, &(lpIOData->OperatorBuf), 1,
NULL, 0, &(lpIOData->COverlapped), NULL) == SOCKET_ERROR)
if (WSAGetLastError() != WSA_IO_PENDING)
{
cout << "WSARecv Failed: " << WSAGetLastError() << endl;
closesocket(lpNewConn->sSocketToRecv);
closesocket(lpNewConn->sSocketToSend);
delete lpNewConn;
delete lpIOData;
assert(false);
}
}
closesocket(sListen);
WSACleanup();
int WSARecv(
__in SOCKET s,
__in_out LPWSABUF lpBuffers,
__in DWORD dwBufferCount,
__out LPDWORD lpNumberOfBytesRecvd,
__in_out LPDWORD lpFlags,
__in LPWSAOVERLAPPED lpOverlapped,
__in LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
// 调用的时候第四个参数lpFlags初始值为0就不会有10045错误了
WSAAccept