Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ UDP客户端未正确形成数据包_C++_Linux_Udp - Fatal编程技术网

C++ UDP客户端未正确形成数据包

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

我正在尝试在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 警告同志:数据未发送:参数无效
它完全编译无误,但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
操作,您将得到该指针的大小。