Сокет: нет данных по recv () - PullRequest
0 голосов
/ 27 марта 2019

У меня есть внешнее оборудование, которое должно отправлять данные каждую секунду на мой программный компьютер (под linux). В документации этого оборудования говорится: Интерфейс Ethernet с фиксированным IP-адресом 192.168.0.40 Порты UDP, используемые для интерфейса Ethernet, 4230 Пункт назначения: 192.168.0.20

Поэтому я попытался написать простейшую из возможных программ для чтения этих данных. IP-адрес моей машины Linux установлен на 192.168.0.20:

#define PORT 4230   
#define BUFSIZE 72 
struct sockaddr_in myaddr; /* our address */ 
struct sockaddr_in remaddr; /* remote address */ 
socklen_t addrlen = sizeof(remaddr); /* length of addresses */ 
int recvlen; /* # bytes received */ 
int fd; /* our socket */ 
unsigned char buf[BUFSIZE]; /* receive buffer */

/* create a UDP socket */ 
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 
{ perror("cannot create socket\n"); return 0; } /* bind the socket to any valid IP address and a specific port */ 

 memset((char *)&myaddr, 0, sizeof(myaddr)); 
 myaddr.sin_family = AF_INET; 
 myaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
 myaddr.sin_port = htons(PORT);

 if (bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) 
 { perror("bind failed"); return 0; } 

 /* now loop, receiving data and printing what we received */ 
 for (;;) 
{ 
    printf("waiting on port %d\n", PORT); 
    recvlen = recvfrom(fd, buf, BUFSIZE, 0, (struct sockaddr *)&remaddr, &addrlen); 
    printf("received %d bytes\n", recvlen); 
    if (recvlen > 0) 
    {
    buf[recvlen] = 0; 
    printf("received message: \"%s\"\n", buf); 
    } 
}

Но я заблокирован в recvfrom (), никогда не получаю данных ... Что я делаю не так? Я пытался изменить INADDR_ANY на правильный IP-адрес, но все тот же ...

Спасибо.

РЕДАКТИРОВАНИЕ / ОБНОВЛЕНИЕ: Использование wireshark У меня есть больше информации о UDP-пакете от внешнего оборудования: Источник 192.168.0.40 Пункт назначения 192.168.0.20 Исходный порт 4230 Дест порт 2430 Может быть, мне нужно уточнить порт Dest в коде? Но я не знаю, где и как это сделать ...

1 Ответ

0 голосов
/ 01 апреля 2019

Пакет предназначен для порта 2430, но ваша программа ожидает ввода на порт 4230 (установите в коде макрос PORT).

Порт должен быть портом, на который вы хотите получать ввод, а не портом источника на другом конце связи.

Поэтому измените макрос PORT на 2430.

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