C++ UDP客户端未正确形成数据包
我正在尝试在Linux中创建一个客户端,以允许发送UDP数据包。到目前为止,程序似乎正确地组成了所有部分,但当我尝试发送数据时,程序无法发送数据包 ,代码的示例输出如下所示: jeremiah@ubuntu:~/Documents/Networking 2/Lab3/client$ sudo ./a.out 192.168.1.128 22222 great success Imperial Soviet Comrade: SVN -> sin_family: 2 Imperial Soviet Comrade: SVN -> sin_port: 52822 Imperial Soviet Comrade: SVN -> sin_addr: -2147374912 Attention Comrade: Enter Message: red Imperial Soviet Comrade: Data in packet dump ::::::::::::::::::::::::::::::::::::::::: start Imperial Soviet Comrade: the size of the UPC is 1576 Imperial Soviet Comrade: Socket: 3 Imperial Soviet Comrade: UPC -> flags: 1 Imperial Soviet Comrade: UPC -> offset: 0 Imperial Soviet Comrade: UPC -> length: 8 Imperial Soviet Comrade: UPC -> filename: red Imperial Soviet Comrade: UPC -> data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Imperial Soviet Comrade: UPC -> data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Imperial Soviet Comrade: UPC -> data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Imperial Soviet Comrade: UPC -> data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Imperial Soviet Comrade: UPC -> data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Imperial Soviet Comrade: UPC -> data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Imperial Soviet Comrade: UPC -> data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Imperial Soviet Comrade: UPC -> data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Imperial Soviet Comrade: UPC -> data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Imperial Soviet Comrade: UPC -> data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Imperial Soviet Comrade: UPC -> data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Imperial Soviet Comrade: UPC -> data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Imperial Soviet Comrade: UPC -> data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Imperial Soviet Comrade: UPC -> data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Imperial Soviet Comrade: UPC -> data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Imperial Soviet Comrade: UPC -> data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Imperial Soviet Comrade: UPC -> data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Imperial Soviet Comrade: UPC -> data: 0000000000000000000000000000000000000000 Imperial Soviet Comrade: sizeof(UPC): 8 Imperial Soviet Comrade: sockaddr.sin_family: 2 Imperial Soviet Comrade: sockaddr.sin_port: 52822 Imperial Soviet Comrade: sockaddr.sin_addr.s_addr: -2147374912 Imperial Soviet Comrade: sizeof(sockaddr): 8 Imperial Soviet Comrade: Data in packet dump ::::::::::::::::::::::::::::::::::::::::::: end Imperial Soviet Comrade: size_sent: -1 Alert Comrade: Data not sent: Invalid argument jeremiah@ubuntu:~/Documents/Networking 2/Lab3/client$sudo./a.out 192.168.1.128 22222 巨大成功 帝国苏维埃同志:SVN->sin_家族:2 帝国苏维埃同志:SVN->sin\u港口:52822 帝国苏维埃同志:SVN->sin_地址:-2147374912 同志们注意:输入信息:红色 帝国苏维埃同志:数据包转储中的数据: 帝国苏维埃同志:UPC的规模是1576 苏维埃帝国同志:套接字:3 帝国苏维埃同志:UPC->旗帜:1 帝国苏维埃同志:UPC->偏移量:0 帝国苏维埃同志:UPC->长度:8 帝国苏维埃同志:UPC->filename:red 帝国苏维埃同志:UPC->数据:00000000000000000000000000000000000000000000000000000000 帝国苏维埃同志:UPC->数据:00000000000000000000000000000000000000000000000000000000 帝国苏维埃同志:UPC->数据:00000000000000000000000000000000000000000000000000000000 帝国苏维埃同志:UPC->数据:00000000000000000000000000000000000000000000000000000000 帝国苏维埃同志:UPC->数据:00000000000000000000000000000000000000000000000000000000 帝国苏维埃同志:UPC->数据:00000000000000000000000000000000000000000000000000000000 帝国苏维埃同志:UPC->数据:00000000000000000000000000000000000000000000000000000000 帝国苏维埃同志:UPC->数据:00000000000000000000000000000000000000000000000000000000 帝国苏维埃同志:UPC->数据:00000000000000000000000000000000000000000000000000000000 帝国苏维埃同志:UPC->数据:00000000000000000000000000000000000000000000000000000000 帝国苏维埃同志:UPC->数据:00000000000000000000000000000000000000000000000000000000 帝国苏维埃同志:UPC->数据:00000000000000000000000000000000000000000000000000000000 帝国苏维埃同志:UPC->数据:00000000000000000000000000000000000000000000000000000000 帝国苏维埃同志:UPC->数据:00000000000000000000000000000000000000000000000000000000 帝国苏维埃同志:UPC->数据:00000000000000000000000000000000000000000000000000000000 帝国苏维埃同志:UPC->数据:00000000000000000000000000000000000000000000000000000000 帝国苏维埃同志:UPC->数据:00000000000000000000000000000000000000000000000000000000 帝国苏维埃同志:UPC->数据:0000000000000000000000000000 苏维埃帝国同志:西泽夫(UPC):8 苏维埃帝国同志:sockaddr.sin_家族:2 帝国苏维埃同志:sockaddr.sinu港口:52822 帝国苏维埃同志:sockaddr.sin_addr.s_addr:-2147374912 帝国苏维埃同志:西泽夫(索卡德尔):8 帝国苏维埃同志:数据包转储中的数据: 帝国苏维埃同志:尺寸:1 警告同志:数据未发送:参数无效C++ UDP客户端未正确形成数据包,c++,linux,udp,C++,Linux,Udp,我正在尝试在Linux中创建一个客户端,以允许发送UDP数据包。到目前为止,程序似乎正确地组成了所有部分,但当我尝试发送数据时,程序无法发送数据包 ,代码的示例输出如下所示: jeremiah@ubuntu:~/Documents/Networking 2/Lab3/client$ sudo ./a.out 192.168.1.128 22222 great success Imperial Soviet Comrade: SVN -> sin_family: 2 Imperial Soviet
它完全编译无误,但printf函数中有来自casts的警告。如果能提供任何帮助,我们将不胜感激。这确实令人怀疑:
int size_sent = sendto(SOCKET, UPC, sizeof(UPC)+2*MAX_MESSAGE, 0,
(struct sockaddr*) &TARGET, sizeof(TARGET)+2*MAX_MESSAGE);
为什么要将2*MAX_消息添加到sockaddr结构的消息长度和大小中?
最后一个很可能是您的sendto()
调用返回-1的原因
还要记住,sizeof(UPC)将是4或8,而不是您想要的大小。
sendto(SOCKET,UPC,sizeof(UPC)+2*MAX_MESSAGE,0,(struct sockaddr*)
——当您真的想要发送一个3字节的数据报时,为什么要发送一个2803字节的数据报呢?这浪费了带宽,保证了任何“正常”情况下的IP碎片化链接,内核可能会选择扔掉这样的数据包(这可能是它不工作的原因)。还要注意的是,select
与recvfrom
结合使用有点傻。你可以只阻塞recvfrom
,这样效率更高,效果也一样(顺便说一句,你也只收到你发送的一半--recvfrom(SOCKET,buffer,MAX_MESSAGE,…)
)我真的有这些,因为我不确定它是否发送了我需要的大小。我确实删除了这两个,并且得到了完全相同的响应。这是因为sizeof(TARGET)也是错误的。目标是指针,而不是它所指向的结构。请注意,这也会使&TARGET错误。您希望发送到(…,TARGET,sizeof(struct sockaddr_in));相反,您缺少了一个非常非常基本的C/C++概念——某个东西的大小与它包含的内容无关,只与它的类型有关。如果您对指针执行sizeof
操作,您将得到该指针的大小。