Server_socket()【復習編】

今日はここまで本もサイトも見ずに書くことができましたー。

#include<stdio.h>
#include<stdlib.h>

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>


void fatal(int errcode,char *errname,struct addrinfo *res){
  fprintf(stderr,"%s():%s\n",errname,gai_strerror(errcode));
  freeaddrinfo(res);
  return(-1);
  
}

void fatal2(int sockfd,char *errname,struct addrinfo *res){
  perror(errname);
  freeaddrinfo(res);
  (void)close(sockfd);
  return(-1);

}

int server_socket(const char *hostnm,const char *portnm)
{
  int sockfd,errcode;
  struct addrinfo hints,*res0;
  char hbuf[NI_MAXHOST];
  char sbuf[NI_MAXSERV];

  (void)memset(&hints,0,sizeof(hints));
  hints.ai_family     = AF_INET;
  hints.ai_socktype   = SOCK_STREAM;
  hints.ai_flags      = AI_PASSIVE;

  if ((errcode = getaddrinfo(hostnm,portnm,&hints,&res0)) != 0)
    return(fatal(errcode,"getaddrinfo",res0));

  if ((errcode = getnameinfo(res0->ai_addr,res0->ai_addrlen,
                              hbuf,sizeof(hbuf),
                              sbuf,sizeof(sbuf),
                              NI_NUMERICHOST | NI_NUMERICSR)) != 0)
    return(fatal(errcode,"getnameinfo",res0));
  fprintf(stderr,"host = %s \nserv = %s\n",hbuf,sbuf);

  if((sockfd = socket(res0->ai_family,res0->ai_socktype,res0->ai_protocol)) == -1){
    perror("socket");
    freeaddrinfo(res0);
    return(-1);
  }

  int opt = 1;
  socklen_t opt_len = sizeof(opt);
  if((setsockopt(sockfd,SOL_SOCKET,SO_REUSERADDR,&opt,opt_len)) == -1)
  //void fatal2(int sockfd,char *errname,struct addrinfo *res)
    return(fatal2(sockfd,"socket",res0));

  if((bind(sockfd,res0->ai_addr,res0->ai_addrlen)) == -1)
    return(fatal2(sockfd,"bind",res0));

  if((listen(sockfd,SOMAXCONN) == -1))
    return(fatal2(sockfd,"listen",res0));

  freeaddrinfo(res0);
  return(sockfd);

結構時間かかるけど面白い。
さー、どんどんacceptとかsend_recvとかも書けるようになろう。

(もはや記憶力の問題かよ。)