解决方案 »
- 这是神马情况?关于BeginPaint()
- 从手机向PC通过蓝牙发送文件 windows xp2SDK+MTK?
- 关于vector读取数据取值问题
- CListCtrl问题
- 自己定义两个类A和B,类A中定义了一个返回类型是指向B类对象的一个指针的函数C,这样有什么错误吗?
- 怎样将使用过inet_addr()函数的IP地址再次转换成字符串型? VC/MFC / 网络编程
- 为编辑框设定enabled属性,请问会触发什么消息
- 放假了,散分,来者有分!!!!!!!
- 想找一本Windows SDK方面的书看看,大家推荐一下呀!来者有分!不够再加!
- 带滚动条的listbox,怎样让滚动条随着在最后加入的行滚动?
- 如何让CEDIT 控件只能输入中文呢
- C++ CMap查找PLookup的使用 找不到已插入的原因。 求高手指教!!!
在connect之前,我已经通过 setsockopt(m_hSocket,SOL_SOCKET,SO_RCVBUF,(const char*)&m_nRcvSize,sizeof(int));将缓冲区定义为2M了接收代码如下:
while(TRUE)
{
FD_ZERO(&fdRead);
FD_ZERO(&fdError);
FD_SET(m_hSocket,&fdRead);
FD_SET(m_hSocket,&fdError);
nRet = select(0,&fdRead,NULL,&fdError,&timeout);
if(FD_ISSET(m_hSocket,&fdRead))
{
nRecvRet = recv(m_hSocket,(char*)&pBuf[nRecvSize],nSize,0);
strLog.Format(_T("TransClient:recv=%d"),nRecvRet);
OutputDebugString(strLog);
if(nRecvRet == -1)
{
strLog.Format(_T("TransClient:LastError=%d"),WSAGetLastError());
OutputDebugString(strLog);
}
if(nRecvRet == 0 || nRecvRet == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK)
{
OutputDebugString(_T("TransClient:nRecvRet=SOCKET_ERROR"));
_DestroySocket();
return NETRET_ERROR;
}
nRecvSize += nRecvRet;
if(GETPACKETLEN(pPacket->nDataSize) <= nRecvSize)//数据已经取完
{
bSuccess = TRUE;
nSize = nRecvSize;
break;
}
nSize = GETPACKETLEN(pPacket->nDataSize) - nRecvSize;
}
else if(FD_ISSET(m_hSocket,&fdError))
{
OutputDebugString(_T("TransClient:fdError"));
_DestroySocket();
return NETRET_ERROR;
}
else//接收超时
{
//nTimeout--;
if(nRet == SOCKET_ERROR)
{
DWORD dwError;
dwError = WSAGetLastError();
break;
}
nRetryTimes--;
if(nRetryTimes < 0)
break;
Sleep(500);
}
}
nSize=2M。
如果将客户端和服务器在同一台机器上运行就没有问题(send和recv都是2M),但在两台机器上运行就出现recv很慢的情况了,如果是网络环境的原因,那上载也应该很慢呀,结果上载又很快,我就有点晕了。
还请各位大哥帮小弟解答一下。
recv方初始nSize必须是pBuf的大小。与网络无关send方的大小是根据网络情况设置的
发送端把2M数据发出去了,实际在在CACHE里,然后关闭SOCKET,如果linger不够长,就会导致,另一段接收数据不完整,出现连接断开的错误。
所以,应该是发完数据,不要关闭socket,应该调用recv,等到一个确认数据接收完毕的确认包,就不会有这样的问题。
我分析应该是这样的,当从服务器端下载数据的时候因为每个包都很大,并且频率也很高,所以杀软认为这是肉鸡在攻击,所以直接把socket给断了。
大家以后一定要注意呀,这次费了这么多事,却是这个原因,太浪费时间了。并祝大家节日快乐,呵呵。