我通过客户端发送十六进制字符:01 03 07 9F 00 0E F5 54 
结果服务器端显示分两次接收,一次接收到:01 03 07 9F 第二次接收到:00 0E F5 54 
这是什么原因?

解决方案 »

  1.   

    看些你服务器端的接收函数,是不是每次接收4个字节
    TCP是数据流,每次收到多少个字节是不一定的。和网络和机器有关系,但是能保证FIFO的序列。
      

  2.   

    接收函数没有字节限制;而且我是在局域网内测试;
    你的Recv函数怎么写的?
      

  3.   

    WSARecv(g_pPerIoDataArr[index]->sockid, &(g_pPerIoDataArr[index]->Buffer), 1, &RecvBytes, &Flags, &(g_pPerIoDataArr[index]->overlap), NULL)
      

  4.   

    发送:01 03 07 9F 00 0E F5 54 分两次,如果发送01 03 07 9F 00 0E F5 54 AB 就分三次;不明白原因?
      

  5.   

    你到socket缓冲区取的时候,并不是对方所有的数据已经发送过来的,
      

  6.   

    接收多次很正常,socket应该也是有缓存机制,send一次,recv可能需要几次,一般情况我们会用循环来确保是否已经接收完了。
      

  7.   

    关键是测试的时候WSARecv中的第4个参数lpNumberOfBytesRecvd为0,这是什么原因?
      

  8.   

    如果客户端传递:AA 01 38 31 31 31 30 30 31 34 34 30 0f 0D
    对函数WSAGetOverlappedResult(SI->sockid, &(SI->overlap), &cbTransferred, TRUE, &Flags)中的参数cbTransferred打印测试发现:
    4
    4
    6
    而不是一次性打印14,什么原因?
      

  9.   

    TCP本来就是这样子的,流式的,你程序一定是不能用这个来处理数据的,处理数据应该有个数据长度属性,接完完整包再处理,否则不断的接
      

  10.   

    读取长度设置为1024,但还是不行。 
    我采用的是重叠IO,其中涉及到函数:WSAWaitForMultipleEvents, WSAGetOverlappedResult, WSARecv等等,不知道你所说的怎么个循环读取?
      

  11.   

    Mr zhao怎么没来贴那个“人多病少财富”
      

  12.   

    读取长度设置为1024,但还是不行。 
    我采用的是重叠IO,其中涉及到函数:WSAWaitForMultipleEvents, WSAGetOverlappedResult, WSARecv等等,不知道你所说的怎么个循环读取?
    你不要设置一个固定长度,我原来做的SOCKET,都分报文头与报文体的,先读报文头的长度,读取完成后,解析,根据报文头的不同,再读不同的报文体,明白?这样就不存在你上述问题了,不管SOCKET发送多少,我只有读取到我要求的长度后再去解析
      

  13.   

    读取长度设置为1024,但还是不行。 
    我采用的是重叠IO,其中涉及到函数:WSAWaitForMultipleEvents, WSAGetOverlappedResult, WSARecv等等,不知道你所说的怎么个循环读取?
    你不要设置一个固定长度,我原来做的SOCKET,都分报文头与报文体的,先读报文头的长度,读取完成后,解析,根据报文头的不同,再读不同的报文体,明白?这样就不存在你上述问题了,不管SOCKET发送多少,我只有读取到我要求的长度后再去解析
    我用的是重叠IO模式,通过一个客户端,有时候会一次接收到。通过另一个客户端就要分三次接收;能否解释为什么会出现这样的情况,客户端发送14个字符,服务器端为什么就要分3次才接收?
      

  14.   

    原来是局域网中连接的串口服务器参数Packing Length设置问题;OK,问题解决了;