使用tcp套接字的发送结构

| 我正在读取文件到结构,然后将它们写入服务器。 这是一段代码:
struct b{
uint16_t num;
char str[10];
} x;
 struct a{
 uint32_t pid;
 char str1[10];
 char str2[10];
} y;
while(fscanf(fp,\"%s\",buff) != EOF)
while(1){
c = getchar();
if (c == \'\\n\')
break;

else
buff[i]= c ;
i++;

write(fd, &b,sizeof(b))
文字档案格式 123 乔治 背风处 如何读取文件并将其存储到每个结构? 当我写到服务器时,它看起来像 write(fd,&a,sizeof(struct a))。 写(fd,&b,sizeof(struct b))? 如何确保正确的填充,字节序 这就是我运行文件的方式:/a.out IP PORT
已邀请:
当您说“读取文件并将其存储到每个结构”时,您能否澄清这个问题? 为了确保正确的填充和字节序,您必须做两件事: 一次将结构发送一个字段。真痛苦由于您将每个结构成员声明为as2ѭ类型(并且来自该家族),因此sizeof()在所有平台上都将为您提供相同的答案。 为了确保字节顺序,您必须使用主机到网络顺序系列。请参阅:http://www.gnu.org/s/hello/manual/libc/Byte-Order.html 执行此操作时,发送时必须使用
htons()
(主机到网络的短路),接收时必须使用
ntohs()
(网络到主机的短路)。对于您的结构的每个成员。 人们常常忽略这一点。如果这两台机器都是现代的Intel机器,这对我们绝大多数人都是正确的,那么您就可以摆脱发送结构的代码。但是就像您提到的那样,这并不能保证填充和增强功能! 您还可以使用#pragma pack()GNU指令指定应如何处理填充。如果您可以同时依赖客户端和服务器的GNU工具链,则此方法有效,因为这不是C规范的一部分。
不要对结构使用send / recv(套接字)或read / write(文件描述符)。几乎可以保证稍后再打破。除其他问题外,结构成员的填充和/或对齐方式可能会根据编译器,编译选项和环境而变化。 而是将数据封送为独立格式(如文本)并发送。如果两边的数据必须绝对相同,则将其编码为base 64并添加一个校验和。 如果绝对必须传输二进制数据,请记住将每个结构成员转换为网络字节顺序(
man byteorder
),然后分别发送每个。

要回复问题请先登录注册