Server の常駐

Server の常駐と TCP/IP 接続とポート番号の説明です。
Server と Client で通信 では Client にメッセージを送信するとすぐ終了していましたが、繰り返し要求を受け付けます。
受信\Main.cpp⇒(送信要求)⇒送信\Main.cpp⇒("HELLO")⇒受信\Main.cpp

前田稔(Maeda Minoru)の超初心者のプログラム入門

Server プログラムの説明

  1. 修正は簡単です。
    TCP クライアントからの接続要求を受け付ける部分を、以下のようにループして下さい。
    Server を終了するときは、ウインドウ右上の×ボタンをクリックして強制的に終了させます。
    accept() はクライアントから接続要求があるまで待ち合わせるので、イベントで起動するウインドウズプログラムには不向きです。
        // TCP クライアントからの接続要求を受け付ける
        while(1)
        {   len = sizeof(client);
            sock = accept(sock0, (struct sockaddr *)&client, &len);
            send(sock, "HELLO", 5, 0);
            closesocket(sock);      // TCPセッションの終了
        }
        
  2. TCP/IP による接続では IP アドレスで通信相手のコンピュータを指定します。
    今回のプログラムでは "127.0.0.1" が IP アドレスです。
        // 接続先指定用構造体の準備
        server.sin_family = AF_INET;
        server.sin_port = htons(12345);
        server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
        // サーバーに接続
        connect(sock, (struct sockaddr *)&server, sizeof(server));
        
  3. "127.0.0.1" などは特別な IP アドレスで、次のようなものが定義されています。
    INADDR_BROADCAST と INADDR_NONE は同じ値ですが、使用する状況で意味が異なります。
        ・INADDR_ANY        (0,0,0,0)           誰でもいいから
        ・INADDR_LOOPBACK   (127,0,0,1)         自分自身(ネットワークに出さずに折り返し)
        ・INADDR_BROADCAST  (255,255,255,255)   ネットワークに繋がっている全コンピュータ
        ・INADDR_NONE       (255,255,255,255)   存在しない(リターン値など)
        
  4. 例えば Server 側では、不特定多数の Client からの要求を受け付けるために IP アドレスを 「誰でもいいから」に設定しています。
        // ソケットの設定
        addr.sin_family = AF_INET;
        addr.sin_port = htons(12345);
        addr.sin_addr.S_un.S_addr = INADDR_ANY;
        bind(sock0, (struct sockaddr *)&addr, sizeof(addr));
        
  5. IP アドレスで通信相手に送られたメッセージをアプリケーションに振り分けるのがポート番号です。
    上記の例では 12345 のポート番号が使われています。
  6. アプリケーションによっては専用のポート番号が割り当てられています。
    小さい番号はバッティングする危険性があるので、大きな番号を使って下さい。
        ・HTTP    80番
        ・電子メール
          送信    25番
          受信    110番
        ・FTP     21番
        ・0番は空いているものが自動的に割り振られます。
        
  7. Server と Client で通信 の Client と組み合わせてテストして下さい。
    Client 側は何度でも起動することが出来ます。

超初心者のプログラム入門(Win32API C++)