2011-04-18 237 views
0

我正在读取文件到结构中,然后将它们写入服务器。 以下是一段代码:使用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)) 

文本文件格式

  • 乔治
  • 我如何读取和存储文件到每个结构?

  • 当我写一个服务器,它看起来像

  • 写(FD,&一个,的sizeof(结构A))。 write(fd,& b,sizeof(struct b))? 如何保证正确的填充,字节序

我这是怎么运行的文件:/a.out IP端口< file.txt的

+0

[发送结构在TCP(C编程)]可能的重复(http://stackoverflow.com/questions/1734819/sending-struct-over-tcp-c-编程) – 2011-04-18 23:26:01

+0

欢迎来到堆栈溢出!在提出新问题之前,请使用搜索。 SO上已经提出了许多问题,您可以立即找到答案。 – 2011-04-18 23:27:20

回答

0

当你说“读取和存储文件到每个结构” ,你能澄清这个问题吗?

以确保正确的填充和字节序,你必须做两件事情:

  1. 发送结构一个场一次。这是一个痛苦。由于您将每个结构成员声明为uint16_t类型(以及来自该系列),所以sizeof()将在所有平台上给出相同的答案。

  2. 为确保排序,您必须使用主机到网络订单系列。请参阅:http://www.gnu.org/s/hello/manual/libc/Byte-Order.html

  3. 当你做到这一点,你必须发送时,然后ntohs()(网络到主机短)接收时使用htons()(主机到网络短)。对于你的结构的每个成员。

通常人们会忽视这一点;如果两台机器都是现代英特尔盒子,这对我们绝大多数人来说都是如此,那么您可以摆脱发送结构的代码。但就像你刚才提到的那样,这不符合填充和结果!

您也可以使用#pragma pack() GNU指令来指定如何处理填充。如果您可以依赖于您的客户端和服务器的GNU工具链,这将起作用,因为这不属于C规范的一部分。

0

不要对结构使用send/recv(套接字)或读/写(文件描述符)。实际上保证稍后休息。在其他问题中,结构成员的填充和/或对齐可以根据编译器,编译选项和环境而改变。

而是将数据编组为独立格式(如文本)并发送该数据。如果两边的数据必须完全相同,则将其编码到基址64并预先设置校验和。

如果您绝对必须传输二进制数据,请记住将每个结构成员转换为网络字节顺序(man byteorder)并分别发送每个结构成员。