我采用的是异步通信方式TCP通信,在同一个软件同一台机中收发数据完全正确,但当分到不同计算机上运行时通信质量时好时坏。首先应该排除硬件问题,因为两台机处于同一局域网内,传输速度达到10M/S,而传输的数据在10K以内。
故障如下("->"为数据传输方向):
A机->B机:接收数据时好时坏,并且多数情况下收到的数据是不完整的,通常只能接收1/3数据.B机在单步调试时,收到完整数据的高率大大增加!(猜想是处理速度或同步问题,在单步处加Sleep(500),执行效果依然没有改善- -).
A机<-B机:接收数据完整!!!
以下是部分代码,要更详细的:
初始化:
m_sockServer = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,0);
注册异步事件:
WSAAsyncSelect(m_sockServer, m_hWnd, UM_RECV, FD_ACCEPT|FD_READ|FD_CLOSE|FD_WRITE)
发送代码:
SOCKET conSock = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,0);
CString tem;
CStock *temDataS=new CStock[N+1];//缓冲区
char *sendbuf;
int i;
// bind
sockaddr_in sin;
sin.sin_addr.S_un.S_addr = inet_addr("10.10.15.209");
sin.sin_family = AF_INET;
sin.sin_port = htons(5100);
connect(conSock, (sockaddr*)&sin, sizeof(sin));
//乱七八糟赋值语句
sendbuf=(char *)temDataS;
send(conSock, sendbuf, sizeof(CStock)*(N+1), 0);
closesocket(conSock); 
delete[] temDataS;
接收代码: CStock *temData=new CStock[N+2];//缓冲区
char *buf = (char *)temData;
CString tem;
int nRecv = recv(cliSock, buf, sizeof(CStock)*(N+2), 0);
if(nRecv<=0)
{
tem.Format("读取数据错误: %d", WSAGetLastError());
MessageBox(tem);
delete[] temData;
return;
} closesocket(cliSock);
//取出数据,这里发现数据接收不完整。
delete[] temData;各位有没有发现什么端倪呢?感觉是见鬼了......

解决方案 »

  1.   

    int nRecv = recv(cliSock, buf, sizeof(CStock)*(N+2), 0); 
    if(nRecv <=0) 
    这里你不仅仅要检测<0的情况,还要检测正值
    原因是这个函数并不保证直到所有的sizeof(CStock)*(N+2)数据全部收完才退出,而是只要有点接收,即使只有一字节,它也可能返回。你需要在这里循环接收,直到所有数据收完google查“粘包”
      

  2.   

    int nRecv = recv(cliSock, buf, sizeof(CStock)*(N+2), 0);
    在这里你设置个断电 或者做个输出 你会发现你收的长度不等于你缓冲区的长度
    原因可能是你说的sleep的问题
    解决方案是你判断nRecv是否等于你发送的消息的长度 不等于就继续接收
      

  3.   

    http://blog.vckbase.com/arong/archive/2010/01/03/40672.html
      

  4.   

    直接到1/3的话,就让它SLeep()一下再试试