UNIXãããã¯ã¼ã¯ããã°ã©ãã³ã°ã®ãåå¼· (1)
3é£ä¼ä½ãããããã¨èãã¦ãããï¼ãªãã¨ãªããã¼ã¢ã³ããã°ã©ã ãæ¸ãã¦ã¿ãããªã£ãã®ã§ï¼Cã«ãããããã¯ã¼ã¯ããã°ã©ãã³ã°ãåå¼·ãããã¨ã«ããï¼
2å¹´ãããåã«æç®[1]ãè³¼å ¥ãï¼éå»ã«2åã»ã©åå¼·ãããã¨æã£ãããã©ï¼ã¨ã«ããã¤ã³ã¯ã«ã¼ãããå¿ è¦ããããããã¼ãã¡ã¤ã«ã大éã«ããæç¹ã§å«æ°ãå·®ãã¦æ«æãã¦ãã¾ã£ãï¼
ã½ã±ããã®ã¤ã¡ã¼ã¸ã¯ããã£ã¦ããã¤ããã ããã©ï¼å®ã¯ããããã£ã¦ããªãã£ãï¼ãªããããããªãããã©ï¼ä»æ¥æ¬ãèªã¿ãªããã¦ãã¦ãã³ã¼ããæ¸ãã¦ãããè²ã ã¤ãªãã£ã¦åºæ¬çãªãã¨ãçè§£ãããã¨ãã§ããï¼
ãã¼ã¢ã³ãä½ãã¨ããã¾ã§è¡ãããã£ãããã©ï¼éä¸ã¾ã§ã§ãã£ãã䏿ï¼ãµã¼ãããã°ã©ã ï¼ã¯ã©ã¤ã¢ã³ãããã°ã©ã ãæ¸ãæé ãã¡ã¢ãã¦ããï¼
- ãµã¼ãããã°ã©ã
- socketãã¤ãã
- bindãã
- listenãã
- acceptãã
- ããããå¦çãã
- ã¯ã©ã¤ã¢ã³ãããã°ã©ã
- socketãã¤ãã
- connectãã
- ããããå¦çãã
ãµã¼ãããã°ã©ã ãåããã»ã¹ãä½ãå ´åã«ã¯ï¼acceptã®æ®µéã§forkããã°ããï¼ãããã¸ãã¯ã¾ãä»åº¦åå¼·ãããï¼
socketãä½ãéã«ï¼sockaddr_inæ§é ä½ããããã®ã ããã©ï¼Cããã°ã©ãã³ã°ã«æ £ãã¦ããªãã¨ããªãã«ãªã¹ã«è¦ããã®ã§ï¼ååã¯ããã§æ°æã¡æªããªã£ã¦ãã¾ã£ããã¨ãæãåºããï¼ãã¡ãã¨çºããã¨ï¼å½ããåã®ãã¨ããã¦ãããã¨ã«æ°ãã¤ããï¼
ã¨ã«ããããããããããã¡ã¤ã«ãã¤ã³ã¯ã«ã¼ãããªããã°ãããªãï¼æç®[2]ãè¦ãªããï¼ãªãã»ã©ããã¯ãã®ããããã¡ã¤ã«ãªã®ãï¼ã¨æã£ã¦ããããã©ï¼30åçµã£ããå ¨ã¦å¿ãã¦ããï¼å¯¾å¿ãè¦ããã®ã¯ããããã¦ï¼é¢æ°ãè¦ãã¦ããã¦ï¼ãã®é½åº¦manãããã¨ã«ãããï¼
æ (*1)ï¼è·å ´ã®Ubuntuã«ãªã³ã©ã¤ã³ããã¥ã¢ã«ãå ¥ãã¦ãããï¼
ããmanãå ¥ãã¦ãªãã®ãï¼ãã®ãã¨ããï¼ã
ã¨å 輩ã«åããããã®ãæãåºããï¼manãå¼ããªããã³ã¼ããæ¸ãããã«ãªã£ãã®ã§ï¼å°ãã¯æé·ããã®ãããããªãï¼
(*1) ã¯ãï¼ã»ãã®ä¸å¹´ã¡ãã£ã¨åã§ãï¼ããã¾ããï¼
ç´°ããã¡ã¢
bindã§ããªããªã
ã©ãããã¯ã©ã¤ã¢ã³ããã忢ããªãã¨TIME_WAITç¶æ ã«ããããbindã«å¤±æããã¨ããã®ãçç±ãããï¼
sockaddr_in.sin_addrã®è¨å®æ¹æ³
è²ã ãªæ¹æ³ããã
- inet_addr, inet_atonãå©ç¨ããæ¹æ³
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> struct sockaddr_in sin; // in_addr_t inet_addr(const char *cp) // 255.255.255.255ã®å ´å-1ãè¿ãã®ã§ï¼ã¨ã©ã¼å¦çã®è¦³ç¹ããinet_aton()使ç¨ãæ¨å¥¨ sin.in_addr = inet_addr("127.0.0.1"); // int inet_aton(const char *cp, struct in_addr *pin) inet_aton("127.0.0.1", &(sin.sin_addr));
- gethostbyname()ãå©ç¨ããæ¹æ³
hostentæ§é ä½ãè¿ãããã®ã§ï¼äºåº¦æéããã
#include <netdb.h> struct hostent *gethostbyname(const char *name); // memcpyã§h->h_addrãsin_addrã«ã³ãã¼ãã // c.f. #define h_addr h_addr_list[0] // h_length /* length of address; IPv4ã®å ´å4ãã¤ã */ hostent *h = gethostbyname("localhost"); memcpy(sin.sin_addr, h->h_addr, h->h_length);
æ®ã£ãçå
accept()ã®ä½¿ãæ¹
æç®ã«ãã£ã¦ï¼accept()ãè¡ãéã«ç¬¬2,3弿°ã渡ãï¼æ¸¡ããªãæ¹æ³ããããããï¼ã¯ã©ã¤ã¢ã³ãæ å ±ã使ããªãå ´åã§ãä¸å¯§ã«sockaddr_inæ§é ä½ãç¨æãã¦ï¼æ å ±ãåãåã£ã¦ããï¼
// SYNOPSIS #include <sys/types.h> #include <sys/socket.h> int accept(int s, struct sockaddr * restrict addr, socklen_t * restrict addrlen); // åèæç®[1] clinet_soc = accept(server_soc, NULL, NULL); // åèæç®[2] struct sockaddr_in client_sin; memset(client_sin, 0, sizeof(client_sin); int addrlen = sizeof(client_sin); client_soc = accept(server_soc, (struct sockaddr *) &client_sin, &addrlen);
ã¾ã ããã£ã¦ããªããã¨
- send, recvã®ä½¿ãæ¹ (ä»åã¯write, readã使ã£ã¦ãã)
åèæç®
ä»ååèã«ããæç®ã¯ä»¥ä¸ã®2ã¤ï¼ä»ã«ãããããè¯æ¸ã¯ããã«éããªãï¼
- [1] éªç°ä¿®ä¸. UNIXãããã¯ã¼ã¯ããã°ã©ãã³ã°. æè¡è©è«ç¤¾ (2003).
- [2] å ç°æºå²ç£ä¿®, æ ªå¼ä¼ç¤¾ã·ã¹ãã è¨ç»ç ç©¶æç·¨. Cè¨èªã«ããããã°ã©ãã³ã° -å¿ç¨ç·¨- 第2ç. ãªã¼ã 社 (2002).
æç®[1]ã¯ï¼ã¹ãããã¢ããã§ããããã«æ¸ããã¦ããï¼å¾åã§ã¯ï¼ååã§ä½æããèªä½ã©ã¤ãã©ãªãå©ç¨ããããã«ãã¦ããã®ã§ï¼Cããã°ã©ãã³ã°ã®åå¼·ã«ããªãï¼ã¾ãï¼ã½ã¼ã¹ãåå²ãï¼Makefileãä½ã£ã¦ã³ã³ãã¤ã«ãã¦ããã®ã§makeã®ä½¿ãæ¹ã®åå¼·ã«ããªãï¼åã¯æ¾ãèªã¿ããããã¨ããã®ã§ï¼ãªããªãçè§£ãã§ããªãã£ãã®ã ã¨æãï¼ããç¨åº¦çè§£ããã¨ããã«ï¼ãªãã¦ä¸å¯§ã«æ¸ããã¦ãããã ã¨æããã®ã§ï¼ï¼ï¼
æç®[2]ã¯è§£èª¬ãã¨ã¦ãä¸å¯§ï¼ä¾ãã°æ§é ä½ãã©ã®ãããã§å®£è¨ããã¦ãããï¼ããã¦æ§é ä½ã®åè¦ç´ ãã©ã®ãããªæå³ãæã£ã¦ãããã¨ãããã¨ãè¨è¿°ããã¦ããï¼ãããã¯ã¼ã¯ããã°ã©ãã³ã°ã«éããï¼å ¥éæ¸ã«ã¯æ¸ãã¦ããªãï¼æå¤ã¨æ¬ã«æ¸ããã¦ããªã大åãªãã¨ãæ¸ããã¦ããå°è±¡ (å ¨é¨èªãã§ããªãã®ã§)ï¼ã¨ã«ãããä¸å¯§ãã¨ããã®ãæ£ãã形容è©ã ã¨æãï¼