2012-01-18 3 views
0

В настоящее время я работаю с лазерным датчиком, который передает поток данных UDP в порт 2368. Я вижу пакеты с Wireshark.Не удается получить поток UDP из порта 2368 (Linux) C

Как я не в состоянии отправить изображение, я пишу то, что Wireshark показывает для пакета:

Источник: 192.168.17.141 Назначение: 192.168.3.255 Протокол: UDP Порт источника: HTTPS (443) Порт назначения: OpenTable (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; 
} 

PROGR am успешно, пока не дойдет до recvfrom(). Там сокет ждет пакетов и ничего не получает. Я написал ту же программу для Windows с Winsock, и она отлично работала. Поскольку я относительно новичок в ОС Linux, я не знаю, как исправить эту проблему, и был бы благодарен за советы!

Дополнительная информация: Я вручную назначен следующий IP и маску подсети для ETH4 (это интерфейс, к которому подключен прибор):

IP: 192.168.3.5 NM: 255.255.255.0

+2

Ваша программа C++, а не C, поскольку вы используете переменную 'cout', часть iostream класса C++. –

+3

192.168.3.255 будет широковещательным адресом с сетевой маской 255.255.255.0, вам обычно нужно включить опцию сокета SO_BROADCAST для приема этих пакетов. Но если 192.168.17.141 отправляется на ваш компьютер, он не может отправлять на широковещательный адрес вашей сети 24, поэтому здесь должны быть некоторые путаницы с сетевой маской. – nos

+2

Вы ожидаете пакеты размером 1 октет? – wildplasser

ответ

0

Вы

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

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

+0

Благодарим вас за ответ! К сожалению, изменение IP-адреса датчика невозможно! Я также попробовал вашу предложенную конфигурацию, но без успеха. – user1156079

+0

Если IP-адрес датчика не может быть изменен, вы можете изменить свой Destination и IP-адрес вашего Linux-хоста в диапазоне 192.168.17.x. Если это невозможно, вам также нужен маршрутизатор с поддержкой широковещательной передачи. Какие настройки IP вы использовали в Windows? –

+0

Я использовал те же настройки, которые описаны выше (192.168.3.5, 255.255.255.0) для моего приложения Windows, и он работал нормально. Я просто установил свой IP-адрес на 192.168.17.5, но я до сих пор не получаю никаких пакетов. Возможно ли, что что-то блокирует порт 2368? – user1156079

0
char buffer[1200+6]; /* no need for dynamic buffers */ 
... 
n = recvfrom(sock, buffer, sizeof buffer, 0, NULL, NULL); 

BTW ваше использование recvfrom() эквивалентно

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

, или даже:

n = read(sock, buffer, sizeof buffer); 
1

Установите опцию SO_BROADCAST, даже для приема. В соответствии с розеткой из (7) страница руководства:

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

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

Смежные вопросы