Не удается получить поток UDP от порта 2368 (Linux) C - PullRequest
0 голосов
/ 18 января 2012

В настоящее время я работаю с лазерным датчиком, который доставляет поток данных 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

Ответы [ 3 ]

1 голос
/ 19 января 2012

Установите параметр SO_BROADCAST, даже для получения.Согласно странице сокета (7):

SO_BROADCAST:Установите или получите флаг трансляции.При включении сокеты датаграмм принимают пакеты, отправленные на широковещательный адрес , и им разрешено отправлять пакеты на широковещательный адрес.Эта опция не влияет на потоковые сокеты.

Возможно, неверная конфигурация интерфейса.Убедитесь, что для данного интерфейса настроен адрес 192.168.3.xxx/24.

0 голосов
/ 18 января 2012
char buffer[1200+6]; /* no need for dynamic buffers */
...
n = recvfrom(sock, buffer, sizeof buffer, 0, NULL, NULL);

Кстати, использование вами функции recvfrom () эквивалентно

n = recv(sock, buffer, sizeof buffer, 0);

или даже:

n = read(sock, buffer, sizeof buffer);
0 голосов
/ 18 января 2012

У вас есть

IP: 192.168.3.5 NM: 255.255.255.0

и

Source: 192.168.17.141 Destination: 192.168.3.255

Это не может работать, если не задействован маршрутизатор. Попробуйте

IP: 192.168.3.5 NM: 255.255.0.0

как временная мера, но прочитайте IP

Редактировать: Может быть, лучше заглянуть в свой лазерный датчик и установить его на 192.168.3.[something free], указав пункт назначения непосредственно на 192.168.3.5, и отладить вещание позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...