Могу ли я определить, используется ли UDP-сокет или подключенный UDP-сокет?
Могу ли я определить, использует ли клиентское приложение UDP-сокет или подключенный UDP-сокет?
Если да, то как? Если нет, почему?
1 ответ
Решение
Как я уже сказал в моем комментарии выше, вызов кода connect
на сокете UDP. Это обеспечивает только трафик к / от адреса соединения, разрешенного (и все другие пакеты отбрасываются) и позволяет использовать отправку вместо 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
Наличие значения, которое не *:*
в Foreign Address
столбец для сокета UDP покажет, имеет ли сокет адрес подключения, связанный с ним.