3,881
社区成员
发帖
与我相关
我的任务
分享
// FALSE == m_lpfnAcceptEx( m_pListenContext->m_Socket, pAcceptIoContext->m_sockAccept, p_wbuf->buf, p_wbuf->len - ((sizeof(SOCKADDR_IN)+16)*2),
// sizeof(SOCKADDR_IN)+16, sizeof(SOCKADDR_IN)+16, &dwBytes, p_ol)
m_lpfnAcceptEx( m_pListenContext->m_Socket, pAcceptIoContext->m_sockAccept, p_wbuf->buf, 0,
sizeof(SOCKADDR_IN)+16, sizeof(SOCKADDR_IN)+16, &dwBytes, p_ol)
_DoAccpet函数中
// m_lpfnGetAcceptExSockAddrs(pIoContext->m_wsaBuf.buf, pIoContext->m_wsaBuf.len - ((sizeof(SOCKADDR_IN)+16)*2),
// sizeof(SOCKADDR_IN)+16, sizeof(SOCKADDR_IN)+16, (LPSOCKADDR*)&LocalAddr, &localLen, (LPSOCKADDR*)&ClientAddr, &remoteLen);
m_lpfnGetAcceptExSockAddrs(pIoContext->m_wsaBuf.buf, 0,
sizeof(SOCKADDR_IN)+16, sizeof(SOCKADDR_IN)+16, (LPSOCKADDR*)&LocalAddr, &localLen, (LPSOCKADDR*)&ClientAddr, &remoteLen);UINT WorkerThread(LPVOID pParam)
{
P_IO_DATA temp_overlapped;
P_CLIENT temp_client;
DWORD dTransLen;//传送的字节数
WSABUF wsabuf;//WSASend用的
while(1)
{
BOOL bRet = ::GetQueuedCompletionStatus(g_hIOCompletionPort, &dTransLen, (PULONG_PTR)&temp_client, (OVERLAPPED **)&temp_overlapped, WSA_INFINITE);
// 如果收到的是退出标志,则直接退出
if ( EXIT_CODE == (DWORD)temp_client)
{
break;
}
//如果出现异常
if (!bRet)
{
RELEASE_SOCKET(temp_client->sClient);
//RELEASE(temp_client);
RELEASE(temp_overlapped);
continue;
}
//OutputDebugString(L"读取数据\n");
switch (temp_overlapped->enIoType)
{
case SEND:
temp_overlapped->cIoData[dTransLen] = 0;
ClientAddr = &temp_client->sockClientAddress;
sprintf_s(ViewSend, "发送至%s:%d信息:%s",inet_ntoa(ClientAddr->sin_addr), ntohs(ClientAddr->sin_port), temp_overlapped->cIoData);
break;
case RECV:
temp_overlapped->cIoData[dTransLen] = 0;
ClientAddr = &temp_client->sockClientAddress;
memset(ViewRecv, 0, sizeof(ViewRecv));
sprintf_s(ViewRecv, "收到%s:%d信息:%s",inet_ntoa(ClientAddr->sin_addr), ntohs(ClientAddr->sin_port), temp_overlapped->cIoData);
//这里添加对接收消息的处理
MySend(temp_client->sClient, cBackData);
break;
}
}
return 0;
}//发送一个异步的读操作
void MyRecv(const SOCKET & s)
{
P_IO_DATA p_recv = new IO_DATA;
p_recv->enIoType = RECV;
WSABUF wsabuf;
memset(&p_recv->ol,0,sizeof(p_recv->ol));
memset(p_recv->cIoData,0,sizeof(p_recv->cIoData));
memset(&wsabuf, 0, sizeof(wsabuf));
wsabuf.buf = p_recv->cIoData;
wsabuf.len = 512;
DWORD dwRecv;
DWORD dwFlg = 0;
memset(&p_recv->ol,0,sizeof(p_recv->ol) );
::WSARecv(s, &wsabuf, 1, &dwRecv, &dwFlg, &p_recv->ol, NULL);
Sleep(1);
}
//发送一个异步的读操作
void MySend(const SOCKET & s, char* buf)
{
P_IO_DATA p_send = new IO_DATA;
p_send->enIoType = SEND;
WSABUF wsabuf;
memset(&p_send->ol,0,sizeof(p_send->ol));
memset(p_send->cIoData,0,sizeof(p_send->cIoData));
memset(&wsabuf, 0, sizeof(wsabuf));
strcpy_s(p_send->cIoData, buf);
wsabuf.buf = p_send->cIoData;
wsabuf.len = strlen(wsabuf.buf);
DWORD dwSend;
DWORD dwFlg = 0;
::WSASend(s, &wsabuf, 1, &dwSend, dwFlg, &p_send->ol, NULL);
}