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とかも書けるようになろう。
(もはや記憶力の問題かよ。)