2017-05-02 1 views
2

man 2 sendto에서 : 성공UDP 소켓의 경우 send 함수가 실패하지 않지만 요청한 것보다 적은 데이터를 쓰는 것이 실제로 발생할 수 있습니까?

, 이러한 호출은 전송 된 바이트 수를 반환합니다. 에러시 -1이 반환되고 errno가 적절하게 설정됩니다.

그러므로 현실적으로 UDP 소켓에 기록 할 때의 send() 기능 요청보다 적은 데이터를 기록하는 발생할 수 있습니다, 나는 이러한 기능의 실패로 처리되지 않은 모든 데이터를 쓸 수있는 그 실패를 이해하고 있습니까하지만, 이 실패의 이유는 errno에 명시되어 있지 않습니까?

send()-1을 적절하게 반환하고 errno을 적절하게 설정하거나 보낼 요청 바이트 수를 반환 할 수 있습니까? 즉

는 : 충분한이 오류 처리 코드 :

if(send(udp_sock_fd, buf, buflen, 0) == -1) { 
    int err = errno; 
    fprintf(stderr, "Send failed:\n"); 
    fprintf(stderr, strerror(err)); 
} 

아니면 그런 일 작성 오히려 필요하다 :

ssize_t bytes_send = send(udp_sock_fd, buf, buflen, 0); 
if(bytes_send == -1) { 
    int err = errno; 
    fprintf(stderr, "Send failed:\n"); 
    fprintf(stderr, strerror(err)); 
} else if(bytes_send < buflen) { 
    fprintf(stderr, "Incomplete send for unknown reason.\n"); 
} 
+0

좋은 질문입니다. 또한 궁금합니다. 당신에게 "그냥 시도해보십시오"라고 말하는 사람을 때려주세요. –

+0

그냥 사용해보세요. :) – jiveturkey

+0

@jnbbender * slap *; P 더 심각한 점은 어떻게 도움이 될 수 있는지 모르겠다. 그런 상황을 유발할 수 있다고 생각하지 않는다. 실패한 시도가 없다면이 상황을 증명할 수 없다. 우연히 있다. – gaazkam

답변

4

(A)의 한 부분을 전송의 개념이 없습니다를 데이터 그램. 모두가 가거나, 아무도 가지 않습니다. OS 또는 네트워크 드라이버가 데이터 그램을 분할하지 않습니다. 보내진 문자 수를 반환하는 것은 다른 send API 함수와 인라인을 이루기 위해 정중해야합니다. 매뉴얼 페이지에서 또한

: 메시지가 기본 프로토콜을 통해 원자 전달하는 데 너무 긴 경우 sendto()를 들어

는 오류 EMSGSIZE가 반환되고, 메시지가 전송되지 않습니다.

2

분명히 @Paul Bentley는 이미 정답을 제시해 주었지만, 결코 일어나지 않을 것이라고 생각되는 경우에도 - 경우에 따라 약간의 오류가 발생할 수도 있습니다. 적어도 특정 구현 (Linux)의 경우 udp_sendmsg의 코드는 net/ipv4/udp.c (궁극적으로 UDP 소켓에서 send으로 호출 됨)은 음수가 아닌 값을 반환 할 수있는 출구가 하나 뿐인 점에 유의해야합니다. 호출자가 제공 한 길이를 반환합니다.

int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) 
{ 
     ... code that doesn't modify len ... 
out: 
     ... 
     if (!err) 
       return len; 
     ... 
} 
관련 문제