我可以检测是使用UDP套接字还是连接的UDP套接字?

时间:2016-10-27 07:21:40

标签: sockets networking udp netstat

我可以检测客户端应用程序是使用UDP套接字还是已连接 UDP套接字?

如果是,怎么样?如果不是,为什么?

1 个答案:

答案 0 :(得分:2)

正如我在上面的评论中所说,在UDP套接字上调用代码connect。允许仅允许进出连接地址的流量(并且所有其他数据包都被丢弃)并允许您使用send而不是sendto,但流量仍然是UDP。

可以使用命令行中的netstat命令来查看数据报套接字是否具有远程地址关联:

例如,假设代码执行了此操作:

// create a datagram socket that listens on port 12345
sock = socket(AF_INET, SOCK_DGRAM, 0);
port = 12345;
addrLocal.sin_family = AF_INET;
addrLocal.sin_port = htons(port);
result = bind(sock, (sockaddr*)&addrLocal, sizeof(addrLocal));

// associate the socket only with packets arriving from 1.2.3.4:6666
addrRemote.sin_family = AF_INET;
addrRemote.sin_port = htons(6666);
addrRemote.sin_addr.s_addr = ipaddress;  // e.g. "1.2.3.4"
result = connect(sock, (sockaddr*)&addrRemote, sizeof(addrRemote));

相应的netstat -a -u会显示以下内容:

ubuntu@ip-10-0-0-15:~$ netstat -u -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
udp        0      0 ip-10-0-0-15:12345      1.2.3.4:6666            ESTABLISHED

UDP套接字的*:*列中存在的值不是Foreign Address,将显示套接字是否具有与之关联的连接地址。