我可以检测是否使用了 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
列中存在不是 *:*
的值,则表明该套接字是否具有与其关联的连接地址。
我能否检测客户端应用程序是使用 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
列中存在不是 *:*
的值,则表明该套接字是否具有与其关联的连接地址。