単純なserver program

単純な client program

前節の単純なserver programの client は telnet で十分なのだが、 プログラムの考察という意味で、対応する client program を書いて みよう。一般に client program の方が簡単単純なはずなのだが、ここでは host名(argv[1])からアドレスを得る部分に多くのコードを使うはめに なっている。

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

#include <netdb.h>
#include <arpa/inet.h>

#define MYBUFSIZE 128

int main(int argc, char* argv[])
{
  int s;
  int n;
  struct hostent *hp;
  struct sockaddr_in sa;

  unsigned long inaddr;
  int port;

  static char buf[MYBUFSIZE + 1];

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

  memset((char*)&sa, 0, sizeof(sa));
  sa.sin_family = AF_INET;
  sa.sin_port = htons((unsigned short)port);
  if((inaddr = inet_addr(argv[1])) != INADDR_NONE)
    memcpy((char*)&sa.sin_addr, (char*)&inaddr, sizeof(inaddr));
  else
  {
    if((hp = gethostbyname(argv[1])) == NULL)
    {
      fprintf(stderr, "Host %s is unknown\n", argv[1]);
      return (-1);
    }
    if(hp->h_addrtype != AF_INET)
    {
      fprintf(stderr, "Host %s has no Internet address\n", argv[1]);
      return (-1);
    }
    memcpy((char*)&sa.sin_addr, (char*)hp->h_addr, hp->h_length);
  }

  if((s = socket(PF_INET, SOCK_STREAM, 0)) == -1)
  {
    fprintf(stderr, "Cannot create socket.\n");
    return 1;
  }
  if(connect(s, (struct sockaddr*)&sa, sizeof(sa)) == -1)
  {
    fprintf(stderr, "Cannot connect to %s:%d\n", argv[1], port);
    close(s);
    return 1;
  }
  while((n = recv(s, buf, MYBUFSIZE, 0)) > 0)
  {
    buf[n] = 0;
    printf( "%s", buf );
  }
  close(s);
  return 0;
}

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