我目前正在使用激光传感器在端口2368上传送UDP数据流。我可以使用Wireshark查看数据包。
由于我无法发布图像,因此我写了Wireshark为数据包显示的内容:
资料来源:192.168.17.141 目的地:192.168.3.255 协议:UDP 源端口:https(443) 目的地港口:可开放(2368)
但是,我想使用以下示例C程序的套接字来读取数据包:
int main(int argc, char *argv[])
{
int sock, n, res;
unsigned int length = 1206;
char* buffer = new char[1206];
sock= socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) error("socket");
uint16_t udp_port = 2368;
sockaddr_in my_addr;
socklen_t len = sizeof(sockaddr_in);
memset(&my_addr, 0, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(udp_port);
my_addr.sin_addr.s_addr = INADDR_ANY;
cout << my_addr.sin_family << endl;
cout << my_addr.sin_port << endl;
cout << my_addr.sin_addr.s_addr << endl;
res = bind(sock, (sockaddr *)&my_addr, sizeof(sockaddr_in));
if (res == -1)
{
perror("bind");
return -1;
}
while (true)
{
n = recvfrom(sock,buffer,1,0,NULL,NULL);
if (n < 0) error("recvfrom");
}
close(sock);
return 0;
}
该计划成功,直至recvfrom()
。套接字等待包,没有收到任何东西。我用Winsock为Windows编写了相同的程序,它运行得很好。因为我对Linux操作系统比较陌生,所以我不知道如何解决这个问题,并感谢您的建议!
附加信息:我手动为eth4分配了以下IP和网络掩码(这是设备连接的接口):
IP:192.168.3.5 NM:255.255.255.0
答案 0 :(得分:1)
设置SO_BROADCAST选项,即使是接收也是如此。根据socket(7)手册页:
SO_BROADCAST:
设置或获取广播标志。启用后,数据报套接字 接收发送到广播地址的数据包 ,并允许它们将数据包发送到广播地址。此选项对面向流的套接字没有影响。
也可能是您的界面配置不正确。验证您是否为相关接口配置了192.168.3.xxx/24地址。
答案 1 :(得分:0)
你有
IP: 192.168.3.5 NM: 255.255.255.0
和
Source: 192.168.17.141 Destination: 192.168.3.255
如果没有涉及路由器,则无法使用。尝试
IP: 192.168.3.5 NM: 255.255.0.0
作为临时措施,但请阅读IP
修改:也许更好地查看您的激光传感器并将其设置为192.168.3.[something free]
,直接将目标设为192.168.3.5
,然后再调试广播。
答案 2 :(得分:0)
char buffer[1200+6]; /* no need for dynamic buffers */
...
n = recvfrom(sock, buffer, sizeof buffer, 0, NULL, NULL);
BTW你对recvfrom()的使用等同于
n = recv(sock, buffer, sizeof buffer, 0);
,甚至:
n = read(sock, buffer, sizeof buffer);