如何使用recvfrom监听来自某个主机的UDP数据报?
我有一个C代码片段上UDP套接字侦听进来的消息(和正常工作):如何使用recvfrom监听来自某个主机的UDP数据报?
uint32_t udp_port = 101010; // example port
int sock_udp = socket(AF_INET, SOCK_DGRAM, 0);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(udp_port);
bind(sock_udp, (struct sockaddr*) &server_address, (socklen_t) sizeof(server_address));
char buffer[20];
struct sockaddr_in sender_address;
socklen_t sender_len = (socklen_t) sizeof(struct sockaddr_in);
ssize_t rcv_len = recvfrom(sock_udp, buffer, sizeof(buffer), 0, (struct sockaddr *) &sender_address, &sender_len);
它后,我对在SENDER_ADDRESS结构发信人信息和我可以检查ADDRES,端口等。我的问题是:我可以使用recv
,recvfrom
或其他类似函数来侦听来自某个主机的数据报吗?换句话说,是否可以在不读取数据报的情况下从其他数据源中删除数据报?
如果您的数据报套接字为connect(2)
,则可以“过滤”并接收来自指定单一源的数据报。
如果套接字的sockfd是
SOCK_DGRAM
类型的然后addr是地址 其中数据报通过默认,并从其中 数据报接收唯一地址发送。
The standard短语它有一点不同:
对于
SOCK_DGRAM
插座,对端地址标识了所有 数据报在后续send()
功能发送的,并且限制了 远程发送用于后续recv()
功能
我应该'连接'而不是'绑定',或之后? – 2013-04-07 10:38:23
@WojciechPtak在绑定后执行此操作。 – cnicutar 2013-04-07 10:38:52
您在调用'recvfrom'之前忘记填写'sender_len'。 – 2013-04-07 10:28:02
正确,已更正。 – 2013-04-07 10:41:17