C++とnetwork programming

まずは以下のような機能を持つ単純な server program について考察しよう。

  • 相手から接続を受けたら文字列 Hello<CR><LF> を送信し接続を切る。

この server は短い文字列を送信するだけなので、 一度に処理する接続は一つだけとしよう。すなわち、 multi-thread を使わず、同一 thread 内で service 処理を記述するものとしよう。

まずは C で書いてみよう。Linux 版で gcc を前提にしたものを以下に示す。 エラー処理(といってもそれまでに開いた socket を close してプログラム を抜けるだけであるが)のために若干長くなっているが、基本的には 単純である。send() についてはエラーが あろうが無かろうが service を終了して接続を切ることに変わりはないので エラー処理はつけてない。また最後の2行は決して実行されない(その前に while(1) があるので)が一応つけてある。

#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>

#define BACKLOG 3
#define SERVICE_PORT 8888

int main()
{
  int s;
  int t;
  struct sockaddr_in sa;
  struct sockaddr_in ca;
  socklen_t calen;

  memset((char*)&sa, 0, sizeof(sa));
  sa.sin_family = AF_INET;
  sa.sin_port = htons( SERVICE_PORT );
  sa.sin_addr.s_addr = htonl( INADDR_ANY );

  if((s = socket(PF_INET, SOCK_STREAM, 0)) == -1)
    return 1;
  if(bind(s,(const struct sockaddr*)&sa,sizeof(sa)) == -1)
  {
    close(s);
    return 1;
  }
  if(listen(s,BACKLOG) == -1)
  {
    close(s);
    return 1;
  }
  while(1)
  {
    calen = sizeof(ca);
    if((t = accept(s,(struct sockaddr*)&ca, &calen)) == -1)
    {
      close(s);
      return 1;
    }
    send(t, "Hello\r\n", 7, 0);
    close(t);
  }
  close(s);
  return 0;
}

このプログラムを実行すると port 8888 で接続を待つ。同一マシンの別プロセスから

telnet localhost 8888

とすれば、

$ telnet localhost 8888
Trying 127.0.0.1...
Connected to localhosts (127.0.0.1).
Escape character is '^]'.
Hello
Connection closed by foreign host.
$

のようになるだろう。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-04-26 (水) 13:06:40