gpt4 book ai didi

c - 套接字 : no data on recv()

转载 作者:行者123 更新时间:2023-11-30 16:20:17 26 4
gpt4 key购买 nike

我有一个外部设备,应该每秒向我的程序计算机(在Linux下)发送数据。该设备的文档说:固定 IP 地址为 192.168.0.40 的以太网接口(interface)用于以太网接口(interface)的 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也许我需要精确代码上的目标端口?但我不知道在哪里以及如何执行此操作...

最佳答案

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

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

因此将 PORT 宏更改为 2430

关于c - 套接字 : no data on recv(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55377619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com