Reputation: 683
I have a C code snippet that listens on UDP socket for incomming messages (and it works fine):
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);
After it I have information on the sender in sender_address structure and I can check addres, port etc. My question is: can I use recv
, recvfrom
or other similar function to listen for datagrams coming from a certain host? In other words, is it possible to drop datagrams from other sources without reading them?
Upvotes: 2
Views: 1923
Reputation: 182649
You can "filter" and receive datagrams from a specified single source if you connect(2)
the datagram socket.
If the socket sockfd is of type
SOCK_DGRAM
then addr is the address to which datagrams are sent by default, and the only address from which datagrams are received.
The standard phrases it a little different:
For
SOCK_DGRAM
sockets, the peer address identifies where all datagrams are sent on subsequentsend()
functions, and limits the remote sender for subsequentrecv()
functions
Upvotes: 1