我有一个外部设备,该设备应该每秒将数据发送到我的程序计算机(在Linux下)。该设备的文档说: 具有固定IP地址192.168.0.40的以太网接口 以太网接口使用的UDP端口为4230 目的地:192.168.0.20
因此,我试图编写最简单的程序来读取这些数据。我的Linux机器IP设置为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 也许我需要在代码上调整目标端口?但是我不知道在哪里以及如何做...
答案 0 :(得分:0)
该数据包发往端口2430
,但您的程序正在等待端口4230
上的输入(在代码中由PORT
宏设置)。
该端口应该是您要在其上接收输入的端口,而不是通信另一端的源端口。
因此,将PORT
宏更改为2430
。