免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3565 | 回复: 4
打印 上一主题 下一主题

socket:windows server/linux client TCP recv结构体大小问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-17 11:02 |只看该作者 |倒序浏览
本帖最后由 computerzanz 于 2011-12-17 11:07 编辑

可能不该发在这个版里,版主见谅
windows server端有个结构体
  1. #pragma pack(push, 1)
  2. struct data
  3. {
  4.      int a;
  5.      char b[100];
  6.      bool c;
  7. ......
  8. }
  9. #pragma pack(pop)
复制代码
linux client相同的结构体
  1. typedef struct data
  2. {
  3.        int a;
  4.        char b[100];
  5.        bool c;
  6. ......
  7. } __attribute__((packed)) mytype_t;
复制代码
windows server 调用send发送结构体,client 调用recv接收。
Q1:为什么windows client 能够一次接受结构体大小,而linux client 通常分几次接收,接收大小之和是结构体大小?
Q2:为什么"相同的程序"windows client能够顺利接受数据,而linux client却间歇性的长时间阻塞在recv上,查看server端这时的send返回值是正常,linux client recv就是接收不到。
难道和linux/windows 的socket平台有关?还请达人明示

P.S:server 和 client int 都是32位的

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
2 [报告]
发表于 2011-12-17 14:31 |只看该作者
本帖最后由 crazyhadoop 于 2011-12-17 14:37 编辑

send 正确,不保证你数据就发到了给对端。recv阻塞是没有收够想接收到的数据。client分几次接收很正常啊,跟你这个recv调用的参数有关吧。

论坛徽章:
0
3 [报告]
发表于 2011-12-18 10:29 |只看该作者
TCP是没有记录边界的字节流协议,所以一次没有收完也正常阿。另外write调用成功返回,linux里面意思是:只是把应用程序缓冲区数据已经拷贝到了套接字的发送缓冲区,程序可以重新使用原来的应用进程缓冲区(阻塞方式),并不表明对端已经收到数据。windows的write调用应该也是这种意思,差别不大吧。你要验证,就windows和linux两边抓包,这不就可以了。

论坛徽章:
0
4 [报告]
发表于 2011-12-19 14:33 |只看该作者
谢谢,确实~~

论坛徽章:
0
5 [报告]
发表于 2011-12-19 14:34 |只看该作者
嗯,多谢提示~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP