В настоящее время я работаю с лазерным датчиком, который доставляет поток данных UDP через порт 2368. Я вижу пакеты с помощью Wireshark.
Поскольку я не могу опубликовать изображение, я пишу, что показывает Wireshark для пакета:
Источник: 192.168.17.141
Пункт назначения: 192.168.3.255
Протокол: UDP
Порт источника: https (443)
Порт назначения: открываемый (2368)
Однако я хочу прочитать пакеты, используя сокеты, в следующем примере программы C:
int main(int argc, char *argv[])
{
int sock, n, res;
unsigned int length = 1206;
char* buffer = new char[1206];
sock= socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) error("socket");
uint16_t udp_port = 2368;
sockaddr_in my_addr;
socklen_t len = sizeof(sockaddr_in);
memset(&my_addr, 0, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(udp_port);
my_addr.sin_addr.s_addr = INADDR_ANY;
cout << my_addr.sin_family << endl;
cout << my_addr.sin_port << endl;
cout << my_addr.sin_addr.s_addr << endl;
res = bind(sock, (sockaddr *)&my_addr, sizeof(sockaddr_in));
if (res == -1)
{
perror("bind");
return -1;
}
while (true)
{
n = recvfrom(sock,buffer,1,0,NULL,NULL);
if (n < 0) error("recvfrom");
}
close(sock);
return 0;
}
Программа успешна, пока не достигнет recvfrom()
. Там сокет ждет пакетов и ничего не получает. Я написал ту же программу для Windows с Winsock, и она отлично работала. Поскольку я относительно новичок в ОС Linux, я не знаю, как решить эту проблему, и буду благодарен за совет!
Дополнительная информация: я вручную назначил следующий IP и маску сети на eth4 (это интерфейс, к которому подключено устройство):
IP: 192.168.3.5
НМ: 255.255.255.0