iocp如何保持连接 客户端连接后可以向服务端发送消息,但是发送后要想再次发送,就必须再次进行连接操作,有什么方法可以保持连接呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 第一、你使用的是什么方式的连接?tcp?第二、服务器收到数据后是否断开了连接?把你服务器接收和客户端发送的代码贴出来看看 是TCP接收函数BOOL accept2(){ SOCKET m_ClientSock; SOCKADDR_IN ClientAddr; int nLen=sizeof(sockaddr); if((m_ClientSock=WSAAccept(m_ListenSocket, (sockaddr *)&ClientAddr, &nLen, NULL, NULL))==SOCKET_ERROR) return 0; m_AcceptNotify(m_ClientSock, CLIENT_CONNECTED);、、通知回调函数 if((PerHandleData=(LPPER_HANDLE_DATA)GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA)))==NULL) return 0; PerHandleData->Socket = m_ClientSock; memcpy(&(PerHandleData->SockaddrInfo), &ClientAddr, sizeof(sockaddr)); if(CreateIoCompletionPort((HANDLE)m_ClientSock, CompletionPort, (DWORD)PerHandleData, 0)==NULL) return 0; if((PerIoData=(LPPER_IO_OPERATION_DATA)GlobalAlloc(GPTR, sizeof(PER_IO_OPERATION_DATA)))==NULL) return 0; ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED)); PerIoData->DataBuf.len=DATA_SIZE; PerIoData->DataBuf.buf=PerIoData->Buffer; PerIoData->opterion=OP_READ; DWORD Flags=0; DWORD RecvBytes; if(WSARecv(m_ClientSock, &(PerIoData->DataBuf), 1, &RecvBytes, &Flags, &(PerIoData->Overlapped), NULL)==SOCKET_ERROR) { if(WSAGetLastError()!=ERROR_IO_PENDING) return 0; } return 1;}发送函数BOOL send2(SOCKET s, PBYTE pBuf, int nSize){ if((PerIoData=(LPPER_IO_OPERATION_DATA)GlobalAlloc(GPTR, sizeof(PER_IO_OPERATION_DATA)))==NULL) return 0; ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED)); PerIoData->BytesRECV=0; PerIoData->BytesSEND=nSize; PerIoData->DataBuf.len=nSize; PerIoData->DataBuf.buf=(char *)pBuf; memcpy(PerIoData->Buffer, pBuf, nSize); PerIoData->opterion=OP_WRITE; DWORD RecvBytes; if(WSASend(s, &PerIoData->DataBuf, 1, &RecvBytes, 0, &PerIoData->Overlapped, NULL)==SOCKET_ERROR) { return 0; } return TRUE;} 第一,你的WSAAccept的时候只有一个socket(m_ClientSock),你看看你这个socket在什么时候会给释放并且你这个socket是已经付给PerHandleData了,看看在啥时候是否有释放第二,你这个模式只有一个客户端连上来吗?现在是不是连上后发送一个消息,客户端就断开了?如果是的话估计是随着PerHandleData给释放掉这个socket了 一旦连接后会保持连接的,除非网络掉线,服务端close掉你的socket。 好像不是失去连接了 而是被阻塞了1 C->S 成功2 S->C 成功3 C->S 成功4 C->S 失败5 S->C 成功 同时返回4中的结果 用MFC做出来的,显示找不到DLL文件 COM进程外服务器的原理是什么?? 如何生成树形菜单 &* 最惨的事情: 下木马被人发现是病毒,非常郁闷~ spy_pass.zip(five32.exe) 该怎么修改才能不是病毒呢? *& 高手请进 如何编程登录局域网上邻居的机器! 想做一个VC6.0那样的WorkSpace,谁有这方面的经验或代码? CDialog指针 DrawDib函数调用错误,请帮助解决! I/O完成端口怎么理解啊 guest用户如何禁止用户使用任务管理器杀本进程? Installshield12添加卸载程序
第二、服务器收到数据后是否断开了连接?把你服务器接收和客户端发送的代码贴出来看看
是TCP接收函数
BOOL accept2()
{
SOCKET m_ClientSock;
SOCKADDR_IN ClientAddr;
int nLen=sizeof(sockaddr);
if((m_ClientSock=WSAAccept(m_ListenSocket, (sockaddr *)&ClientAddr, &nLen, NULL, NULL))==SOCKET_ERROR)
return 0; m_AcceptNotify(m_ClientSock, CLIENT_CONNECTED);
、、通知回调函数 if((PerHandleData=(LPPER_HANDLE_DATA)GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA)))==NULL)
return 0; PerHandleData->Socket = m_ClientSock;
memcpy(&(PerHandleData->SockaddrInfo), &ClientAddr, sizeof(sockaddr));
if(CreateIoCompletionPort((HANDLE)m_ClientSock, CompletionPort, (DWORD)PerHandleData, 0)==NULL)
return 0; if((PerIoData=(LPPER_IO_OPERATION_DATA)GlobalAlloc(GPTR, sizeof(PER_IO_OPERATION_DATA)))==NULL)
return 0; ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));
PerIoData->DataBuf.len=DATA_SIZE;
PerIoData->DataBuf.buf=PerIoData->Buffer;
PerIoData->opterion=OP_READ; DWORD Flags=0;
DWORD RecvBytes;
if(WSARecv(m_ClientSock, &(PerIoData->DataBuf), 1, &RecvBytes, &Flags, &(PerIoData->Overlapped), NULL)==SOCKET_ERROR)
{
if(WSAGetLastError()!=ERROR_IO_PENDING)
return 0;
}
return 1;
}发送函数
BOOL send2(SOCKET s, PBYTE pBuf, int nSize)
{
if((PerIoData=(LPPER_IO_OPERATION_DATA)GlobalAlloc(GPTR, sizeof(PER_IO_OPERATION_DATA)))==NULL)
return 0;
ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));
PerIoData->BytesRECV=0;
PerIoData->BytesSEND=nSize;
PerIoData->DataBuf.len=nSize;
PerIoData->DataBuf.buf=(char *)pBuf;
memcpy(PerIoData->Buffer, pBuf, nSize);
PerIoData->opterion=OP_WRITE; DWORD RecvBytes;
if(WSASend(s, &PerIoData->DataBuf, 1, &RecvBytes, 0, &PerIoData->Overlapped, NULL)==SOCKET_ERROR)
{
return 0;
}
return TRUE;
}
并且你这个socket是已经付给PerHandleData了,看看在啥时候是否有释放第二,你这个模式只有一个客户端连上来吗?现在是不是连上后发送一个消息,客户端就断开了?如果是的话估计是随着PerHandleData给释放掉这个socket了
2 S->C 成功
3 C->S 成功
4 C->S 失败
5 S->C 成功 同时返回4中的结果