2017-05-02 3 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関数とインラインで一致するように、礼儀だけでなければなりません。 manページからも

:メッセージは、基層となるプロトコルを不可分に通過長すぎるsendto()については

は、エラーEMSGSIZEが返され、メッセージが送信されていません。

2

明らかに、@Paul Bentleyは正解をすでに提供していますが、これが起こるはずはないにしても、まれにエラーが発生する可能性があることを心配している場合少なくとも特定の実装(Linux)の場合、udp_sendmsgのコードはnet/ipv4/udp.c(これはUDPソケット上で最終的にsendと呼ばれます)には、負でない値を返すことができるexitが1つしかないことに注意してください。呼び出し側が指定した長さを返します。

int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) 
{ 
     ... code that doesn't modify len ... 
out: 
     ... 
     if (!err) 
       return len; 
     ... 
} 
関連する問題