如何发送空UDP报文

我们知道UDP是无连接的,接收和发送一个报文是独立的,而TCP则实现了一整套的诸如流量控制和拥塞控制机制,保证连接的可靠性。


在本文中,你将了解在Socket API中如何发送一个空的UDP报文,并且通过tcpdump抓取后用wireshark查看报文内容。

本文缘起对recvfrom的返回值的困惑,因为在TCP中,用recv或者read函数,我们可以通过其返回值是否为0,来判断对端的连接状态,是则表示对端关闭写通道,更可能的情况是close掉了连接。
但是在UDP中很少见到recvfrom的返回值是0,在man手册中,只说了TCP的recv保留0以指示对端关闭的情况,这个TCP包是空的,因为只需要TCP头部的FIN信息。

所以,动手看看吧!
recvfrom返回0表示有数据包达到,但是数据部分为空,在wireshark中看到,UDP的长度字段为8,正好是UDP的头部长度,数据部分的确为空。

下图是通过sendto函数广播的空UDP报文:
udp空数据

发送使用sendto,只是设置发送的长度为0,发现返回值为0;同样,接收使用recvfrom,接收广播的消息,发现当空数据包达到时,返回值为0。如下:

sendto(sockfd, buffer, 0, 0, (struct sockaddr *)&brctaddr, addrsize); recvfrom(sockfd, buffer, 0, 0, NULL, NULL);

另外在广播过程中,使用tcpdump udp port 5001 -w test.pcap监听5001端口的流量,并保存在test.pcap中供wireshark查看。

实验结束。


TODO: socket API对应的内核相关操作(select和非阻塞IO等)