我正在编写一个基于 udp 的客户端/服务器,我想随每个数据报一起发送一个序列号,我尝试使用 #pragma 或 pack 结构通过 udp 发送该结构,但没有成功。
typedef struct {
char buf[BUF_SIZE]; //buffer size is 4096
int seq;
} pack;
当我尝试发送大小为 131094 位的文件时,我在另一端收到了大小为 135300 位的文件。我的问题是,有没有办法不用序列化就可以做到这一点?
最佳答案
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 字节倍数的情况。
关于c - 通过 udp 套接字发送结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26420787/