【问题标题】:Sending a struct over udp socket通过 udp 套接字发送结构
【发布时间】:2014-10-17 08:19:48
【问题描述】:

我正在编写一个基于 udp 的客户端/服务器,我想随每个数据报一起发送一个序列号,我尝试使用 #pragma 通过 udp 发送结构或打包结构,但没有成功。

typedef struct {
 char buf[BUF_SIZE];    //buffer size is 4096
 int seq;
} pack;

当我尝试发送大小为 131094 位的文件时,我在另一端收到了 135300 位的文件。我的问题是,有没有办法在没有序列化的情况下做到这一点?

【问题讨论】:

  • 这完全有可能,即使可能不明智,您也需要给我们更多代码和更多信息来帮助您。
  • 是的,这完全有可能——如果有问题,那是在您的发送/接收代码中。
  • @Joe 这完全不可能, 除非代码中存在错误。 UDP 数据报完整地到达或根本不到达。 TicTac 你需要发布你的代码。
  • @EJP 我的回答是“有没有办法在没有序列化的情况下做到这一点”。答案是肯定的。为什么他认为自己发送的内容与他认为自己收到的内容不匹配,这完全是一个不同的问题。

标签: c sockets struct udp pack


【解决方案1】:
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 字节的倍数的情况。

【讨论】:

  • 谢谢我改了,还是没解决问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 2011-11-27
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多