1 コンピューターによる通信の例

1.1 IPアドレスの取得

コンピューター同士で通信を行う場合,それぞれのコンピューターの特定にIPアドレスを 使う.その役割は,人間同士が電話で通信を行う場合と同じである.電話番号で通信先を 決めるのと同様に,コンピューター同士ではIPアドレスで通信先を決める.

使用しているパソコンのIPアドレスは,ターミナルで「/sbin/ifconfig」とコマンドを入 力すれば得られる.コマンドの実行結果は,次のようになり,eth0inet addr:IPアドレスとなる.この場合のIPアドレスは,192.169.1.61である.

eth0      Link encap:Ethernet  HWaddr 00:20:ED:5B:3E:F2
          inet addr:192.168.1.61  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::220:edff:fe5b:3ef2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6220 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5403 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:6446053 (6.1 MiB)  TX bytes:627205 (612.5 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:2507 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2507 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:3116664 (2.9 MiB)  TX bytes:3116664 (2.9 MiB)

1.2 通信を行うプログラムの例

ここでは,簡単のプログラムを作成して,通信を体験する.ここのプログラムは,参考文 献 [1]を参考にして作成した.

1.2.1 クライアントプログラム

リスト1はデータを送信するプログラムである.
   1 #include <stdio.h>
   2 #include <string.h>
   3 #include <sys/types.h>
   4 #include <sys/socket.h>
   5 #include <netinet/in.h>
   6 #include <arpa/inet.h>
   7 
   8 int main(int argc, char *argv[])
   9 {
  10   struct sockaddr_in server;
  11   char message[80], ip_address[16],m[80];
  12   int t;
  13 
  14   strcpy(ip_address,argv[1]);
  15 
  16   memset((char *) &server, 0, sizeof(server));
  17   server.sin_family=AF_INET;
  18   server.sin_port = htons(5320);
  19   server.sin_addr.s_addr=inet_addr(ip_address);
  20   t=socket(AF_INET, SOCK_STREAM, 0);
  21   connect(t, (struct sockaddr *) &server, sizeof(server));
  22   
  23   printf("message:");
  24   fgets(message, 80, stdin);
  25   send(t, message, strlen(message),0);
  26 
  27   close(t);
  28 
  29   return 0;
  30 }

1.2.2 サーバープログラム

リスト2はデータを受信するプログラムである.
   1 #include <stdio.h>
   2 #include <string.h>
   3 #include <sys/types.h>
   4 #include <sys/socket.h>
   5 #include <sys/socket.h>
   6 #include <netinet/in.h>
   7 #include <arpa/inet.h>
   8 
   9 int main(void)
  10 {
  11   struct sockaddr_in client, server;
  12   char buf[80];
  13   int t, r, k;
  14   t=socket(AF_INET, SOCK_STREAM, 0);
  15   memset((char *) &server, 0, sizeof(server));
  16   server.sin_family=AF_INET;
  17   server.sin_addr.s_addr = htonl(INADDR_ANY);
  18   server.sin_port = htons(5320);
  19   bind(t, (struct sockaddr *) &server, sizeof(server));
  20   k=sizeof(client);
  21   listen(t, 1);
  22 
  23   
  24   while(1){
  25     r=accept(t, (struct sockaddr *) &client, &k);
  26     recv(r, buf, 80, 0);
  27     printf("%s",buf);
  28     memset(buf,0,80);
  29   }
  30 
  31   close(t);
  32   close(r);
  33 
  34   return 0;
  35 }

1.2.3 実行方法

それぞれをコンパイルして,異なるターミナルで実行する.

ただし,クライアントのプログラムは通信先のIPアドレスを引数にして起動する.例えば, クライアントプログラムの実行ファイル名がcliで,通信相手先のIPアドレスが 192.168.1.51とすると,次のように起動する.

  ./cli 192.168.1.51




ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成19年10月17日


no counter