发送的BUF里并没有带有这些信息。你是指TCP报文框架里的长度吗?一般TCP一个报文大概有4K。如果此次接收的内容不足4K,是不是就认为此次发送完毕了?如果涉及到分包,是否循环等待并读取?但最后如何判断所有报文发送完毕了?

解决方案 »

  1.   

    Delphi里的ServerSocket和ClientSocket控件。如果ClientSocket发送一个100字节的buf过去。ServerSocket能马上触发onReceive事件并得到这100字节的buf及len,不知道它是根据什么确定100字节就是接收完了。
      

  2.   

    你客户端分2次连续send
    包1 11 22 33
    包2 44 55 66
    包1 包2都会放入系统缓冲区等待发送,如果包1未及时发出,那么非常可能导致包1 包2一起被发出,你服务器端收到就是11 22 33 44 55 66,你本意是2个包,但是服务器端收到的是一个包,必须得有协议拆开,固定长度,包头带长度,包尾结束符,显然固定长度不可能,包头带长度是最好的解决办法,我目前看的所有网游包头都带长度。
      

  3.   

    你首先要了解tcp的大框架如何实现客户端send->复制到客户端系统缓冲区等待发送<->TCP协议收发<->复制到服务器端系统缓冲区等待接受->服务器端recvrecv的结果就是复制缓冲区的内容及返回大小,不管里面内容是什么大小多少,所以你recv有可能出现粘包(recv太慢),或者包被切割开的情况(send方包大,recv收太快,这种你得按照自己的协议重新组合),建议你查看下TCP协议如何保证数据传输。