win socket接收数据的问题,帮忙看看。

cnjxrz1 2010-03-17 04:06:27
win socket接收数据的问题,帮忙看看。

网络环境:
1. Server,client 端 均运行在windows系统下,均采用TCP协议,异步方式。
2. 只有一个client去访问server
3. client发送和server接收的频率基本一致,基本不会有client发送多次,server才接收一次的情况。
4. 为保证数据正确性 client 发送的时候组了个TLV结构的包,包比较小,保证不超过10个字节。

我看见有些人的做法是,先接收 T 和 L 部分,算出L后再用while来循环接收 V 部分。

我的理解:
1. V 部分比较大的时候采用上述方法是适合的。
2. 在上述4个条件下,server端待接收的数据比较小,
  能否在Server端接收的时候开 1K 的 buffer,直接写recv(socket, buf, 1024),
  然后判断buf中TLV包的有效性,(buf中有可能有多个TLV包)
如果判断到TAG非法或包长度不符合期望,则直接认为异常,不需要再recv后续数据了。

请问这种观点正确吗?1和2都评定下哦

...全文
98 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
terry2134 2010-07-22
  • 打赏
  • 举报
回复
看2楼的答案
Eleven 2010-05-17
  • 打赏
  • 举报
回复
结贴通知:
请lz注意结贴。。。。
eyodo8 2010-03-17
  • 打赏
  • 举报
回复
路过。。围观。。。接分
WizardK 2010-03-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cnjxrz1 的回复:]

"但为了保证解析过程能够正确的从错误格式包中恢复,建议你还是采用放缓冲,再解析的方式。"

这个不明白,能再解释下吗?
[/Quote]

TLV这种方式主要解决的是变长数据的传送,一般在使用过程中还会增加报文头和V的校验和等。如果在传送过程中,由于某种原因V不够长,就有可能死等或拼凑上了下一包的数据。所以我的意思是不要把接收和解析放在一起去做。
cnjxrz1 2010-03-17
  • 打赏
  • 举报
回复
"但为了保证解析过程能够正确的从错误格式包中恢复,建议你还是采用放缓冲,再解析的方式。"

这个不明白,能再解释下吗?
WizardK 2010-03-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 cnjxrz1 的回复:]
win socket接收数据的问题,帮忙看看。

网络环境:
1. Server,client 端 均运行在windows系统下,均采用TCP协议,异步方式。
2. 只有一个client去访问server
3. client发送和server接收的频率基本一致,基本不会有client发送多次,server才接收一次的情况。
4. 为保证数据正确性 client 发送的时候组了个TLV结……
[/Quote]

可以,T、L、V三部分,不用要求发送端是分别发送的,你只需要接收后从缓冲解析即可,也可以阻塞的方式一步一步接收。但为了保证解析过程能够正确的从错误格式包中恢复,建议你还是采用放缓冲,再解析的方式。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧