echoクライアント用のソースの一部

どうも、検索ワード"echo クライアント"で引っかかってるようなんで、夏に書いたやつの一部をとりあえずコピペ。参考資料はbit別冊の。
connect_sock("192.168.51.33","echo","TCP")とかconnect_sock("www.yahXX.ne.jp","7","UDP")とかすると、それぞれ適宜接続してくれる関数ですよ。
第一引数には接続先アドレス、第二引数にはポート番号またはサービス名、第三引数には接続プロトコルを指定する。返り値はソケットのディスクリプタ
この辺の作業はいちど自作しておくと便利だそうだ。みんな自分で書いたコードを使いまわすんだってさ。少なくとも私はこのコードを使いまわす予定。


エラーの扱いはかなりアヤシイ。enumで指定してれば良いのかな。
ヘッダファイルのインクルードは適宜お願いします。

int connect_sock(const char *hostname, const char *service, const char *protocol)
{
  int sock; /* socket descriptor */
  int socktype; /* type of socket */
  struct hostent  *phost;
  struct servent  *pserv;
  struct protoent *pproto;
  struct sockaddr_in sin;
  /*
    sockaddr_in requires:
      protocol family  (AF_INET)
      host ip address  (network byte order)
      host port number (network byte order)
   */

  memset(&sin, 0, sizeof(sin));
  sin.sin_family = AF_INET; /* address family on Internet */

  /*set port*/
  if( pserv = getservbyname(service, protocol) ){
    sin.sin_port = pserv->s_port;
  }else if( (sin.sin_port = htons((u_int16_t)atoi(service))) == 0 ){
    return NO_SUCH_PORT_ERROR;
    /* no such port */
  }
  
  /*set host*/
  if( phost = gethostbyname(hostname) ){
    memcpy(&sin.sin_addr, phost->h_addr_list[0], phost->h_length);
  }else if( (sin.sin_addr.s_addr = inet_addr(hostname)) ){
    return NO_SUCH_HOST_ERROR;
    /* no such host */
  }

  /*set protocol*/
  if( (pproto = getprotobyname(protocol)) == 0 ){
    return NO_SUCH_PROTO_ERROR;
    /* no such protocol */
  }

  /*set socket-type*/
  if( strcmp(protocol, "udp") == 0 || strcmp(protocol, "UDP") == 0 ){
    socktype = SOCK_DGRAM;
  }else{
    socktype = SOCK_STREAM;
  }

  /*make socket*/
  sock = socket(PF_INET, socktype, pproto->p_proto);
  if(sock<0){
    return SOCKET_NOGOOD_ERROR;
    /* somehow we couldn`t make the socket */
  }
  printf("got socket : %d\n", sock);

  /*connect*/
  if( connect(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0 ){
    return CONNECT_NOGOOD_ERROR;
    /* somehow we couldn`t connect */
  }

  return sock;
  
}