T
truest9
Unregistered / Unconfirmed
GUEST, unregistred user!
在网络通信中,我使用winsock1.1开发的服务器端,自定义了这样一个通信协议
报文头 + 报文大小 + 报文内容
报文头和报文大小的长度固定为30字节,报文大小指明这条报文的总大小。
发送时,只一步:
使用send循环发送,直至完全发送出去。
接收时,分两步:
第一步,使用recv接收报文头和报文大小,即仅接收30字节。(少于30字节算无效数据,丢弃)
第二步,根据从接收的30字节中,得到整条报文的大小,算出还有多少字节没有收完,然后再循环接收剩下的字节,从而完成一条报文处理。
以上流程工作的非常完美,服务器端连续运行三个月,数据吞吐量超过100G,出错率为0。可见此协议方案非常稳定。
但我也有很多疑问:
1、接收时,可以调用一次recv即可收完的数据,却被分为两次调用recv来接收,效率大大降低。
如何不影响接收效率,又能很好逐条处理报文?
2、我准备使用winsock2.0重写服务器端,发现WSARecv函数不像recv那样可以指定接收的字节数。因此我的这种通信方案无法进行。请问如何设计新的通信方案???请高手出招赐教!
报文头 + 报文大小 + 报文内容
报文头和报文大小的长度固定为30字节,报文大小指明这条报文的总大小。
发送时,只一步:
使用send循环发送,直至完全发送出去。
接收时,分两步:
第一步,使用recv接收报文头和报文大小,即仅接收30字节。(少于30字节算无效数据,丢弃)
第二步,根据从接收的30字节中,得到整条报文的大小,算出还有多少字节没有收完,然后再循环接收剩下的字节,从而完成一条报文处理。
以上流程工作的非常完美,服务器端连续运行三个月,数据吞吐量超过100G,出错率为0。可见此协议方案非常稳定。
但我也有很多疑问:
1、接收时,可以调用一次recv即可收完的数据,却被分为两次调用recv来接收,效率大大降低。
如何不影响接收效率,又能很好逐条处理报文?
2、我准备使用winsock2.0重写服务器端,发现WSARecv函数不像recv那样可以指定接收的字节数。因此我的这种通信方案无法进行。请问如何设计新的通信方案???请高手出招赐教!