c - 套接字: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也许我需要精确代码上的目标端口?但我不知道在哪里以及如何做到这一点......
解决方案
数据包的目的地是 port 2430
,但您的程序正在等待 port 上的输入4230
(使用PORT
代码中的宏设置)。
该端口应该是您希望接收输入的端口,而不是通信另一端的源端口。
所以把PORT
宏改成2430
.
推荐阅读
- excel - 仅当特定单元格包含特定值时才执行函数
- ios - Firebase - 如果设置为分页的键已被删除,如何处理分页
- css - CSS 在 Django 管理员中不起作用:由于 MIME 类型(“text/html”)不匹配(X-Content-Type-Options:nosniff),来自 [css 文件 url] 的资源被阻止
- javascript - 在Javascript中生成一个随机整数,不包括数字数组
- ms-word - MS Word 加载项内容控件,带有类似按钮的对话框触发器
- less - 使用 less 时出现一些奇怪的错误
- c# - 带有阿拉伯文文本的 Xaml 字形
- php - 根据用户表[laravel]中的列使用orderBy()订购产品表
- parsing - 将大型文档/文本/HTML 分解成段的良好 ML 模型/技术是什么?
- arrays - 通过在 Perl 中通过数组的哈希映射第一个索引来获取第二个索引的值