受信プログラムの解説
まず受信プログラムでは、エンドポイントのソケットを作り、
それにポートとアドレスを設定します.
udp_socket = socket(AF_INET, SOCK_DGRAM,0);
bzero((char *) &from_addr,sizeof(from_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
my_addr.sin_port = htons(WAIT_PORT);
bind(udp_socket, (struct sockaddr *) &my_addr, sizeof(my_addr));
|
ここでbind()が終了して、アドレスとポートが設定された時点で
UPDパケットは受け付け状態になります。
これ以後、このマシン宛てのデータグラムが届いたら,OSはプログラムが
それを受信するまで保存してくれます。
後は以下のようにして、OSが保存してくれている受信パケットを取り出す
だけです。
n = recvfrom(udp_socket,buf,BUFLEN,flag,&from_addr,&from_len);
|
まだデータが届いていない場合にはブロックされ、
ここでデータが届くまでプログラムは停止します。
送信プログラムの解説
送信プログラムでまずOSにデータを渡すためのソケットを作り、
あて先のマシンのポートとアドレスを取得します.
udp_socket = socket(AF_INET,SOCK_DGRAM,0);
bzero((char *) &dest_addr, sizeof(dest_addr));
dest_addr.sin_family = AF_INET;
dest_host = gethostbyname(DEST_HOSTNAME);
bcopy(dest_host->h_addr,(char *)&dest_addr.sin_addr,dest_host->h_length);
dest_addr.sin_port = htons(DEST_PORT);
|
後は,作成したソケットあて先マシン宛てに、sendto()を用いて
データを送信するだけです。
message = "Hello!\n";
sendto(udp_socket,message,strlen(message),0,&dest_addr,sizeof(dest_addr));
|
届いたかどうか確認する手段はありません。
受信プログラムがbind()していないポート宛てに送ったデータは
失われてしまいます。
|