Socket通信问题,需要网络顶尖高手出招赐教。同时公布我的通信方案和一些心得,欢迎新手参与学习交流。 ( 积分: 100 )

  • 主题发起人 主题发起人 truest9
  • 开始时间 开始时间
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那样可以指定接收的字节数。因此我的这种通信方案无法进行。请问如何设计新的通信方案???请高手出招赐教!
 
在网络通信中,我使用winsock1.1开发的服务器端,自定义了这样一个通信协议
报文头 + 报文大小 + 报文内容
报文头和报文大小的长度固定为30字节,报文大小指明这条报文的总大小。

发送时,只一步:
使用send循环发送,直至完全发送出去。

接收时,分两步:
第一步,使用recv接收报文头和报文大小,即仅接收30字节。(少于30字节算无效数据,丢弃)
第二步,根据从接收的30字节中,得到整条报文的大小,算出还有多少字节没有收完,然后再循环接收剩下的字节,从而完成一条报文处理。

以上流程工作的非常完美,服务器端连续运行三个月,数据吞吐量超过100G,出错率为0。可见此协议方案非常稳定。

但我也有很多疑问:
1、接收时,可以调用一次recv即可收完的数据,却被分为两次调用recv来接收,效率大大降低。
如何不影响接收效率,又能很好逐条处理报文?
2、我准备使用winsock2.0重写服务器端,发现WSARecv函数不像recv那样可以指定接收的字节数。因此我的这种通信方案无法进行。请问如何设计新的通信方案???请高手出招赐教!
 
》第一步,使用recv接收报文头和报文大小,即仅接收30字节。(少于30字节算无效数据,丢弃)

不能丢弃的,除非数据错误;

有时一次只收到几个字的情况;

可以判断接收到的总量,够(一包)数,一次收下;不够不收;
 
我倒是还没有遇到过一次recv不到30字节的情况。呵呵
 
你这样处理应该也不会慢,
 
改为 报文大小 + 报文头 + 报文内容,其中 报文大小定义为dword可能更好

我倒是还没有遇到过一次recv不到30字节的情况。呵呵
-------通讯质量不好的时候(比如跨城市通讯),你就有肯能碰上
可以调用一次recv即可收完的数据,却被分为两次调用recv来接收 。
------- 看通讯的两台机器是否的socket参数是否一样,比如,你是window环境,他是unix环境的
 
1、不能丢弃
2、除非包的长度是固定的,可以一次接收;否则,还是要分两次接收。[:D]
 
后退
顶部