#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
struct sockaddr_in addr;
int fd, cnt,ret;
char ch = 'y',msg[] ="How are you";
if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
printf("Error: socket");
exit(1);
}
printf("\nDone socket\n");
/* set up destination address */
memset(&addr,0,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr("128.88.143.113");
addr.sin_port=htons(9090);
ret=connect(fd,(struct sockaddr *)&addr,sizeof(addr));
perror("Connect:");
while(ch == 'y'){
cnt = send(fd,msg,sizeof(msg),0);
if(cnt < 0)
perror("send:");
printf("\nNumber of bytes sent = %d , \n",cnt);
printf("Continue (y/n)\n");
scanf(" %c",&ch);
}
return 0;
}
上記のコードは、Linuxマシンで実行するようにコンパイルされています。UDPはconnect()後の動作を送信します。
上記のコードがIPアドレス128.88.143.113
のマシンにデータを送信したとします。 UDPソケットは9090
の128.88.143.113
にバインドされていません。 while
ループにおいて
、send()
の最初の呼び出しが成功(パケットが実際にワイヤー上に出る。trace
を使用してチェックする)と第二send()
はConnection refused
で失敗します。 third send()
は成功し、後は失敗します。
最初にsend()
の後にスタックは、ソケット構造に保存されたICMPエラーメッセージ(Linuxマシンではtcpdump
に表示されます)を受信すると考えられます。 2番目のsend()
はこのエラーが発生すると失敗し、実際にパケットは送信されません。 2番目のsend()
は、ソケット構造のエラーもクリアします。したがって、3番目のsend()
は成功し、4番目は失敗します。
質問:
- この仮定が正しいですか?
- 正しい動作は何ですか?このような動作を定義するRFC標準はありますか?
- UDPは接続状態を維持しないので、すべて
send()
が成功するとは限りませんか?
別名インターフェースを経由送信するとき、私はアーチのLinuxマシン上で同様の動作を参照してください。これは解決しましたか? –