我正在编写基于udp的客户端/服务器,我想发送一个序列号以及每个数据报,我试图使用#pragma或包结构在udp上发送结构而没有运气。< / p>
typedef struct {
char buf[BUF_SIZE]; //buffer size is 4096
int seq;
} pack;
当我尝试发送大小为131094位的文件时,我在另一端收到135300位的文件。我的问题是,有没有办法在没有序列化的情况下做到这一点?
答案 0 :(得分:0)
n = recvfrom(sd,&pkt,sizeof(pkt),0,(struct sockaddr *)&clt,&l);
此处n
将为-1或整个接收数据包的大小,包括序列号字。
write(fd, pkt.buf,n)
此处n
仍然是整个接收数据包的大小。您不会从数据包的长度中减去序列号的大小,因此您需要为每次写入写入额外的字节数。你应该打电话
write(fd, pkt.buf, n-sizeof int);
然而,在我看来,数据包也应包含自己的长度,以应对数据不是4096字节的倍数的情况。