Chinaunix
标题:
socket:windows server/linux client TCP recv结构体大小问题
[打印本页]
作者:
computerzanz
时间:
2011-12-17 11:02
标题:
socket:windows server/linux client TCP recv结构体大小问题
本帖最后由 computerzanz 于 2011-12-17 11:07 编辑
可能不该发在这个版里,版主见谅
windows server端有个结构体
#pragma pack(push, 1)
struct data
{
int a;
char b[100];
bool c;
......
}
#pragma pack(pop)
复制代码
linux client相同的结构体
typedef struct data
{
int a;
char b[100];
bool c;
......
} __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位的
作者:
crazyhadoop
时间:
2011-12-17 14:31
本帖最后由 crazyhadoop 于 2011-12-17 14:37 编辑
send 正确,不保证你数据就发到了给对端。recv阻塞是没有收够想接收到的数据。client分几次接收很正常啊,跟你这个recv调用的参数有关吧。
作者:
djsxut
时间:
2011-12-18 10:29
TCP是没有记录边界的字节流协议,所以一次没有收完也正常阿。另外write调用成功返回,linux里面意思是:只是把应用程序缓冲区数据已经拷贝到了套接字的发送缓冲区,程序可以重新使用原来的应用进程缓冲区(阻塞方式),并不表明对端已经收到数据。windows的write调用应该也是这种意思,差别不大吧。你要验证,就windows和linux两边抓包,这不就可以了。
作者:
computerzanz
时间:
2011-12-19 14:33
谢谢,确实~~
作者:
computerzanz
时间:
2011-12-19 14:34
嗯,多谢提示~
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2