我可以检测客户端应用程序是使用UDP套接字还是已连接 UDP套接字?
如果是,怎么样?如果不是,为什么?
答案 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
,将显示套接字是否具有与之关联的连接地址。