Copy constructorと代入演算子

socket class を使って server と client program を書き換える

さて、mysockaddr class と mysocket class を使って、前の server program と client program を書き換えてみよう。

まず server の方。

#include "mysocket.h"

#define BACKLOG 3
#define SERVICE_PORT 8888

int main()
{
  struct sockaddr_in ca;
  socklen_t calen;

  mysockaddr sa( 0, SERVICE_PORT );
  mysocket s(PF_INET, SOCK_STREAM);

  if(s.bind(sa.address(),sa.length()) == -1)
    return 1;

  if(s.listen(BACKLOG) == -1)
    return 1;

  while(1)
  {
    calen = sizeof(ca);
    mysocket t = s.accept((struct sockaddr*)&ca, &calen);
    t.send("Hello\r\n", 7, 0);
  }
  return 0;
}

mysocket のうち t を while loop 中に入れることで close を止めている。 close しなくても while loop の終端で scope からはずれて destructor が呼ばれる。

さて、clinet の方。

#include <cstdio>
#include <cstdlib>
#include "mysocket.h"

#define MYBUFSIZE 128

int main(int argc, char* argv[])
{
  static char buf[MYBUFSIZE + 1];

  if(argc != 3)
  {
    fprintf(stderr,"Usage: %s host port\n", argv[0]);
    return (-1);
  }

  int port = ::atoi(argv[2]);
  mysockaddr sa( argv[1], port );
  mysocket s(PF_INET, SOCK_STREAM);

  if(s.connect(sa.address(), sa.length()) == -1)
  {
    fprintf(stderr, "Cannot connect to %s:%d\n", argv[1], port);
    return 1;
  }
  int n;
  while((n = s.recv(buf, MYBUFSIZE)) > 0)
  {
    buf[n] = 0;
    printf( "%s", buf );
  }
  return 0;
}

こちらも main の scope から抜ける時に s の desctructor が 呼ばれるということで、close を省略している。

だいぶ C++ らしくなってきた。


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