socket通信丢包问题
我写的服务器端将监听端口与窗体绑定啦
ON_MESSAGE(WM_NETWORK_EVENT, OnNetworkEvent)
ON_MESSAGE(WM_PCCSOCK_RECV, OnPccsockRecv)
CList<CString ,CString&> m_msglist;
WSAAsyncSelect(m_SocketSvr.GetServerSock(),m_hWnd,WM_NETWORK_EVENT,FD_ACCEPT|FD_READ|FD_CLOSE);
void CXXXDlg::OnNetworkEvent(WPARAM wParam, LPARAM lParam)
{
if(WSAGETSELECTERROR(lParam)) //判断是否SOCKET出错
{
CString Errmsg;
Errmsg.Format("Socket failed with error %d",WSAGETSELECTERROR(lParam));
WriteLog(Errmsg);
m_SocketSvr.CloseServerSock();
}
switch (WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
m_SocketSvr.AcceptSock();
WSAAsyncSelect(m_SocketSvr.GetConnSock(),m_hWnd,WM_PCCSOCK_RECV,FD_READ/*|FD_CLOSE*/);
break;
case FD_READ:
break;
case FD_CLOSE:
m_svrClosed=true;
WriteLog("服务器Socket关闭");
break;
}
}
void CXXXDlg::OnPccsockRecv(WPARAM wParam, LPARAM lParam)
{
char buff[1024];
memset(buff,0,1024);
char strtmp[20];
memset(strtmp,0,20);
if(WSAGETSELECTERROR(lParam)) //判断是否SOCKET出错
{
CString Errmsg;
Errmsg.Format("Socket failed with error %d",WSAGETSELECTERROR(lParam));
m_SocketSvr.CloseSock(wParam);
}
switch (WSAGETSELECTEVENT(lParam))
{
case FD_READ:
if(!m_SocketSvr.RecvSock(buff))
{
CString pccmsg,acmback;
pccmsg.Format("%s",buff);
if(strlen(buff)>=26) {
sprintf(strtmp,"0013%s",pccmsg.Mid(4,4));
strcat(strtmp,"00000");
acmback.Format("%s",strtmp);
m_SocketSvr.SendSock(strtmp); //收到消息后回馈PCC
m_SocketSvr.CloseConnSock();
DealMsglist(pccmsg);
}
}
break;
case FD_CLOSE:
break;
}
}
int CXXXDlg::DealMsglist(CString& pccmsg, int mode)
{
EnterCriticalSection(&m_CriSection1);//进入临界区
int count = m_msglist.GetCount();
if(!mode)
m_msglist.AddTail(pccmsg);
else
{
if(count)
{
pccmsg=m_msglist.GetHead();
m_msglist.RemoveHead();
}
}
count = m_msglist.GetCount();
LeaveCriticalSection(&m_CriSection1);
return count;
}
==============================================
客户端是别人用JAVA写的,我也不知道他是怎么写的,好像是多线程的
就是开启一个线程A发一条消息给服务器端,再开启一个线程B发一条消息给服务器端,……
据我这边的日志记录,大部分情况是先收到A包,然后是B包,……
偶尔也会出现先收到B包,再收到A包,……
因为它一组数据会有2到4个包,每组数据有很短的间隔(可能0.5s),每组数据的包几乎没有间隔,
这样发了9000多组数据后,大约会有7、8组数据没有记入数据库,查询日志是这7、8组数据通信时丢失了关键的一个包
我们来回测试了很多次,发现丢包率约小于千分之一
请问这个可能是什么问题,怎么解决呢?