У меня есть внешнее оборудование, которое должно отправлять данные каждую секунду на мой программный компьютер (под 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 в коде? Но я не знаю, где и как это сделать ...