为什么收到的TCP数据会丢包?(有代码)
我做的是一个转发服务:
客户端的发送SOCKET:
TCP_NODELAY关闭 ,不采用延时算法 ,立即发送
接收SOCKET也做了粘包的处理
转发服务端的用的IOCP
SOCKET的RCVBUF设为了0,因为客户端发送的数据短而多,发送的非常快
转发SOCKET也是TCP_NODELAY关闭 ,不采用延时算法 ,立即发送
服务端接受线程如下:
DWORD WINAPI ServerWorkerThread(LPVOID ComlpetionPortID)
{
CListBox* m_info=(CListBox*)ComlpetionPortID;
DWORD Recvl;
DWORD Flags;
DWORD l;
LPMHandel rsock;
LPIODATA ol;
WSABUF DATABuf;
char Buffer[TCPBUFSIZE];
DATABuf.len =TCPBUFSIZE;
DATABuf.buf=Buffer;
while (TRUE)
{
if(!GetQueuedCompletionStatus(CompetionPort,&Recvl,(LPDWORD)&rsock,(LPOVERLAPPED*)&ol,INFINITE))
{
m_info->AddString("用户异常退出");
}
if(Recvl==0) //OnClose
{
m_info->AddString("用户断开");
closesocket(rsock->sock);
Vip[rsock->last]=NULL;
UDP[rsock->last-2]=NULL;
continue;
}
ZeroMemory(&(ol->OVerlapped),sizeof(OVERLAPPED));
Flags=0;
WSARecv(rsock->sock,&DATABuf,1,&l,&Flags,&(ol->OVerlapped),NULL);
head temp;
int a;
memcpy(&temp,Buffer,12);
if(temp.pro==103)
{
temp.pro=122;
temp.vip=rsock->vip;
send(rsock->sock,(char*)&temp,12,0);
}else{
a=temp.vip>>24;
send(Vip[a],Buffer,Recvl,0);
}
l=0;
ZeroMemory(Buffer,sizeof(Buffer));
}
}
我发现当客户端数据发送的频率很高时,服务端就会有包没发出去(也可能是没收到),这是什么原因啊??我刚学IOCP,向大家请教一下高效率的IOCP怎么实现?