我的服务器采用ServerSocket.SendBuf(Buf,len1)发送,而客户端采用len2:=ClientSocket.ReceiveBuf(Buf,65536)为什么在发送和接收中len1与len2不相等?

解决方案 »

  1.   

    为什么要相等呢?
    TCP协议本来就只是提供可靠的数据流服务。仅仅数据流,它这一层不提供同步。
      

  2.   

    有可能是網絡速度的原因, 分成兩次或多次到達Client端吧!
      

  3.   

    请问halfdream:要怎么解决同步的问题呢?
      

  4.   

    TCP以上常用的通讯协议,实现同步一般两种..
    1,特定字符作为分隔..
    最明显的例子就是http使用两个回车换行..
    DELPHI带的indy控件组就提供了readln之类方法,可以用指定字符作为同步,非常方便.
    可惜TServerSocket并没有直接接供,需要自己编码才行.2,发送数据块方式.
    在数据块里面特定字段给出数据块的长度信息,以确定数据块的完整性.
    DELPHI的Scktsvr.exe,TSocketConnection就是这样..
      

  5.   

    是这样的,不保证客户端一次性全部收到,所以你要在Client里判断,组合起来。
      

  6.   

    这么说,发送一段数据,接收端就有可能触发多次的Read事件?
      

  7.   

    len2:=ClientSocket.ReceiveBuf(Buf,65536)中Len2最大为8192吧
    你可以多次调用ClientSocket.ReceiveBuf
      

  8.   

    如果Buf定义的是PChar类型,那么你的代码可能写错了。发送端:
    ServerSocket.SendBuf(Buf^, len1);
    接收端:
    len2:=ClientSocket.ReceiveBuf(Buf^, len);当然,如果是流式的还要自己拼凑数据。
      

  9.   

    不会分多次的
    只是你的协议定义和代码有问题
    TCP/IP保证数据传输的顺序和完整性,你的数据加不加分割符号是你自己的数据的问题
    但是在网络上传输的时候TCP/IP协议会自动给你加上通讯层的包头包尾,你的数据可能是一笔一笔到缓冲区发过去的,但是在对方的端点肯定是接收完才有操作系统通知进程
    数据完毕,触发事件处理,或者你主动读写的时候比如用waitfordata都是要等数据完全准备好才会返回true