繁体   English   中英

套接字:没有关于recv()的数据

[英]Socket : no data on recv()

我有一个外部设备,假设每秒发送数据到我的程序计算机(在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也许我需要精确的代码上的dest端口? 但我不知道在哪里以及如何做到这一点......

数据包的目的地是端口2430 ,但是您的程序正在等待端口4230上的输入(在代码中使用PORT宏设置)。

端口应该是您要接收输入的端口,而不是通信另一端的源端口。

因此将PORT宏更改为2430

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM