【发布时间】:2012-02-13 04:22:28
【问题描述】:
我目前正在使用在端口 2368 上提供 UDP 数据流的激光传感器。我可以使用 Wireshark 查看数据包。
由于我无法发布图片,因此我编写了 Wireshark 为数据包显示的内容:
来源:192.168.17.141 目的地:192.168.3.255 协议:UDP 源端口:https (443) 目标端口:opentable (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 海里:255.255.255.0
【问题讨论】:
-
您的程序是 C++,而不是 C,因为您使用
cout变量,它是 C++ 类 iostream 的一部分。 -
192.168.3.255 将是一个网络掩码为 255.255.255.0 的广播地址,您通常必须启用 SO_BROADCAST 套接字选项才能接收这些数据包。但是如果 192.168.17.141 发送到你的机器,它不能发送到你的 /24 网络的广播地址,所以这里的网络掩码肯定有一些混淆。
-
您期待 1 字节大小的数据包?