我可以检测是否使用了 UDP 套接字或已连接的 UDP 套接字吗?

Can I detect whether an UDP-socket or a connected UDP socket is used?

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

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

正如我在上面的评论中所说,在 UDP 套接字上调用代码 connect。这仅强制执行流量 to/from 允许连接地址(并且所有其他数据包都被丢弃)并允许您使用发送而不是 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 列中存在不是 *:* 的值,则表明该套接字是否具有与其关联的连接地址。