UDPのプログラムの解説

  概要   送信
プログラム
  受信
プログラム
  解説

受信プログラムの解説

まず受信プログラムでは、エンドポイントのソケットを作り、 それにポートとアドレスを設定します.

  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()していないポート宛てに送ったデータは 失われてしまいます。

FC Labのホームへ 「ネットワークプログラミング」のページへ