2013-04-07 2 views
2

나는 메시지를 incomming을 위해 UDP 소켓에서 수신 대기는 C 코드를 (그리고 그것을 잘 작동) : 그 후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 구조에서 보낸 사람에 대한 정보를 가지고 내가, 포트 등의 요지를 확인하실 수 있습니다 제 질문은 : recv, recvfrom 또는 다른 유사한 기능을 사용하여 특정 호스트에서 들어오는 데이터 그램을 수신 대기 할 수 있습니까? 즉, 다른 소스에서 데이터 그램을 읽지 않고 드롭 할 수 있습니까?

+0

'recvfrom'을 호출하기 전에'sender_len'을 채워야합니다. –

+0

True로 수정되었습니다. –

답변

1

connect(2) 데이터 그램 소켓 인 경우 지정된 단일 소스에서 데이터 그램을 "필터링"하여 수신 할 수 있습니다. 소켓 sockfd와 유형 SOCK_DGRAM의 경우

는 요지는 데이터 그램은 기본, 및 데이터 그램을 수신있는 유일한 주소로 전송됩니다 의 주소입니다. SOCK_DGRAM 소켓

가 피어 어드레스 모두 그램 후속 send() 기능에 전송되는 위치를 식별하고, 후속 recv() 기능

을위한 원격 발신자 제한 :

The standard

는 조금 다른 어구
+0

'bind'-ing 대신에'connect'를 쓰겠나요? –

+0

@WojciechPtak'bind' 후에 수행하십시오. – cnicutar

관련 문제