如何使用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或其他类似函数来侦听来自某个主机的数据报吗?换句话说,是否可以在不读取数据报的情况下从其他数据源中删除数据报?

+0

您在调用'recvfrom'之前忘记填写'sender_len'。 – 2013-04-07 10:28:02

+0

正确,已更正。 – 2013-04-07 10:41:17

如果您的数据报套接字为connect(2),则可以“过滤”并接收来自指定单一源的数据报。

如果套接字的sockfd是SOCK_DGRAM类型的然后addr是地址 其中数据报通过默认,并从其中 数据报接收唯一地址发送。

The standard短语它有一点不同:

对于SOCK_DGRAM插座,对端地址标识了所有 数据报在后续send()功能发送的,并且限制了 远程发送用于后续recv()功能

+0

我应该'连接'而不是'绑定',或之后? – 2013-04-07 10:38:23

+0

@WojciechPtak在绑定后执行此操作。 – cnicutar 2013-04-07 10:38:52