{"id":4145,"date":"2014-05-09T03:46:23","date_gmt":"2014-05-08T18:46:23","guid":{"rendered":"http:\/\/www.vincentina.net\/?p=4145"},"modified":"2023-06-11T15:18:12","modified_gmt":"2023-06-11T06:18:12","slug":"%e3%81%93%e3%81%aa%e3%81%84%e3%81%a0%e4%bd%9c%e3%81%a3%e3%81%9f%e7%b0%a1%e6%98%93web%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%82%92%e3%83%9e%e3%83%ab%e3%83%81%e3%82%bf%e3%82%b9%e3%82%af%e5%8c%96-2","status":"publish","type":"post","link":"https:\/\/www.vincentina.net\/?p=4145","title":{"rendered":"\u3053\u306a\u3044\u3060\u4f5c\u3063\u305f\u7c21\u6613Web\u30b5\u30fc\u30d0\u30fc\u3092\u30de\u30eb\u30c1\u30bf\u30b9\u30af\u5316\u3059\u308b\u3088\u3002\uff08\uff12\uff09"},"content":{"rendered":"<p>\u524d\u56de\u3084\u3063\u305f<span style=\"font-size: 12pt;\">\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u6bce\u306b\u30d7\u30ed\u30bb\u30b9\u3092\u4f5c\u6210<\/span>\u306e\u7d9a\u304d\u3067\u3001\u4eca\u56de\u306f<\/p>\n<p><span style=\"font-size: 14pt;\">\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u6bce\u306b\u30b9\u30ec\u30c3\u30c9\u3092\u4f5c\u6210<\/span><\/p>\n<p>\u3067\u3059\u3002<\/p>\n<p>fork\u3068\u540c\u3058\u611f\u3058\u3067\u3059\u3093\u306a\u308a\u7d42\u308f\u308b\u304b\u306a\u3042\u3068\u601d\u3063\u3066\u305f\u3093\u3067\u3059\u304c\u3001\u3068\u3053\u308d\u304c\u3069\u3063\u3053\u3044<span style=\"font-size: 12pt;\">\u3060\u3044\u3076\u6642\u9593\u304c\u304b\u304b\u308a\u307e\u3057\u305f<\/span>\u3002\u4eca\u56de\u3082Echo\u3058\u3083\u306a\u304f\u3066Web\u30b5\u30fc\u30d0\u30fc\u3067\u3059\u304c\u3001\u3044\u305f\u308b\u3068\u3053\u308d\u3067\u4fee\u6b63\u304c\u5fc5\u8981\u3067\u59cb\u3081\u306f\u5168\u7136\u52d5\u304b\u305a\u3067\u3057\u305f\u3002<\/p>\n<p>\u4e00\u756a\u306e\u30dd\u30a4\u30f3\u30c8\u306b\u306a\u3063\u305f\u306e\u306fclose(SOCKETNAME)\u3068\u3001pthread_join\u306e2\u500b\u3067\u3057\u305f\u3002\u672c\u66f8\u3067\u306fpthread_detach\u3092\u4f7f\u3063\u3066\u308b\u3093\u3067\u3059\u304c\u3001pthread_join\u306e\u65b9\u304c\u5408\u3046\u3093\u3058\u3083\u306a\u3044\u304b\u3068\u601d\u3063\u3066\u5909\u66f4\u3057\u307e\u3057\u305f\u3002<br \/>\n\u3042\u3068\u306fThreadArgs\u306b\u3064\u3044\u3066\u306e\u60c5\u5831\u304c\u30a6\u30a7\u30d6\u4e0a\u306b\u3082\u5c11\u306a\u304f\u3066\u5927\u5909\u3067\u3057\u305f\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u3068\u308a\u3042\u3048\u305a\u3001\u307e\u305a\u306f\u30d7\u30ed\u30bb\u30b9\u3092\u5897\u3084\u3057\u3066\u51e6\u7406\u3092\u3055\u305b\u308b\u5834\u5408\u3068\u3001\u30b9\u30ec\u30c3\u30c9\u3067\u51e6\u7406\u3059\u308b\u3053\u3068\u306e\u9055\u3044\u306b\u3064\u3044\u3066\u7c21\u5358\u306b\u307e\u3068\u3081\u307e\u3059\u3068<\/p>\n<p>\u30d7\u30ed\u30bb\u30b9\u3092\u751f\u6210\u3059\u308b\u5834\u5408\u3001\u751f\u6210\u3059\u308b\u305f\u3073\u306b\u30e1\u30e2\u30ea\u3001\u30b9\u30bf\u30c3\u30af\u3001\u30bd\u30b1\u30c3\u30c8\u306a\u3069\u3092\u30b3\u30d4\u30fc\u3057\u3066\u3001\u5b50\u30d7\u30ed\u30bb\u30b9\u304c\u51e6\u7406\u3057\u307e\u3059\u3002\u307e\u308b\u3063\u3068\u30b3\u30d4\u30fc\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u308f\u3051\u3067\u3059\u306a\u3002<br \/>\n\u30b9\u30ec\u30c3\u30c9\u306e\u5834\u5408\u306f1\u500b\u306e\u30d7\u30ed\u30bb\u30b9\u3067\u8907\u6570\u30bf\u30b9\u30af\u304c\u51e6\u7406\u304c\u3067\u304d\u3066\u3001\u30a2\u30c9\u30ec\u30b9\u7a7a\u9593\u3092\u5171\u6709\u3059\u308b\u306e\u3067\u3001\u30b3\u30b9\u30c8\u304c\u5b89\u304f\u306a\u308b\u3068\u3044\u3046\u5229\u70b9\u304c\u3042\u308b\u3088\u3046\u3060\u3002<\/p>\n<p>\u305a\u3044\u3076\u3093\u524d\u306b\u306a\u3063\u3066\u3057\u307e\u3046\u3051\u3069\u3001Apache\u306eMPM\u306b\u51dd\u3063\u3066\u305f\u3068\u304d\u306b\u3084\u308a\u307e\u3057\u305f\u304c\u3001Worker\u306f\u9759\u7684\u306a\u30b5\u30a4\u30c8\u3092\u305f\u304f\u3055\u3093\u51e6\u7406\u3055\u305b\u308b\u306e\u306b\u5411\u3044\u3066\u3044\u308b\u3068\u3044\u3046\u3053\u3068\u306b\u3082\u4e00\u81f4\u3059\u308b\u306d\u3002<\/p>\n<p>\u30b9\u30ec\u30c3\u30c9\u306e\u5b9f\u88c5\u306b\u95a2\u3057\u3066\u306f\u3001\u672c\u66f8\u3092\u53c2\u8003\u306b\u3057\u3066\u3044\u308b\u306e\u3067\u540c\u3058\u304fPTread\u3092\u5229\u7528\u3057\u307e\u3059\u3002<br \/>\n\u307b\u304b\u306b\u3082\u3044\u308d\u3044\u308d\u3042\u308b\u3089\u3057\u3044\u3067\u3059\u304c\u3001POSIX\u306a\u3089\u3060\u3044\u305f\u3044\u306eOS\u306b\u5165\u3063\u3066\u3044\u308b\u304b\u3089\u3068\u3044\u3046\u7406\u7531\u3060\u305d\u3046\u3067\u3059\u3002<\/p>\n<p>\u307e\u305a\u306f\u30bd\u30fc\u30b9\u304b\u3089\u3044\u304d\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u304c\u3001\u4e0b\u306e2\u500b\u306e\u95a2\u6570\u306f\u30d7\u30ed\u30c8\u30bf\u30a4\u30d7\u5ba3\u8a00\u3060\u3051\u306b\u306a\u3063\u3066\u307e\u3059\u306e\u3067\u3001TCP\/IP Socket in C\u8457\u8005\u306eMichael J. Donahoo\u6c0f\u306e\u30a6\u30a7\u30d6\u30b5\u30a4\u30c8\u3092\u53c2\u8003\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002<br \/>\n\u53c2\u8003\u30b5\u30a4\u30c8\u3068\u3057\u3066\u8f09\u305b\u3066\u3044\u307e\u3059\u3002<\/p>\n<pre>\u00a019 int AcceptTCPConnection(int servSock);\r\n\u00a020 int CreateTCPServerSocket(unsigned short port);<\/pre>\n<p>\u3053\u3046\u3044\u3046\u306e\u304c\u79fb\u690d\u6027\u304c\u9ad8\u3044\u3068\u3044\u3046\u306e\u304b\u3001\u524d\u56de\u3068\u540c\u3058\u304f\u30a6\u30a7\u30d6\u30b5\u30fc\u30d0\u30fc\u306e\u52d5\u4f5c\u306e\u90e8\u5206\u306b\u306a\u308b\u3001\u300cHandleTCPclient\u6539\u300d\u3068\u300cGETHTML\u300d\u306b\u3064\u3044\u3066\u306f\u307b\u3068\u3093\u3069\u3055\u308f\u3089\u305a\u3067main\u95a2\u6570\u306e\u90e8\u5206\u3092\u3044\u3058\u304f\u3063\u305f\u3068\u3053\u308d\u304c\u591a\u3044\u3067\u3059\u3002<\/p>\n<p>\u30bd\u30fc\u30b9\u3000TCPWebServer_type_Tread.c<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#define _XOPEN_SOURCE 600\r\n#define _POSIX_C_SOURCE 200112L\r\n#undef _REENTRANT\r\n#define _GNU_SOURCE\r\n\r\n#include &lt;stdio.h&gt;\r\n#include &lt;sys\/socket.h&gt;\r\n#include &lt;arpa\/inet.h&gt;\r\n#include &lt;stdlib.h&gt;\r\n#include &lt;string.h&gt;\r\n#include &lt;unistd.h&gt;\r\n#include &lt;netinet\/in.h&gt;\r\n#include &lt;sys\/stat.h&gt;\r\n#include &lt;pthread.h&gt;\r\n#include &lt;sys\/types.h&gt;\r\n#include &lt;sys\/syscall.h&gt;\r\n\r\nvoid *ThreadMain(void *arg);\r\nint AcceptTCPConnection(int servSock);\r\nint CreateTCPServerSocket(unsigned short port);\r\n\r\npid_t gettid(void)\r\n{\r\n\u00a0\u00a0\u00a0 return syscall(SYS_gettid);\r\n}\r\n\r\nstruct ThreadArgs\r\n{\r\n\u00a0\u00a0\u00a0 int clntSock;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* Socket descriptor for client *\/\r\n};\r\n\r\ntypedef struct {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 char method&#x5B;16];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 char path&#x5B;128];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 char version&#x5B;16];\r\n} HEAD_DATA;\r\n\r\n\/\/#define DEBUG\r\n#define MAXPENDING 5\r\n\r\nvoid DieWithError(char *errorMessage)\u00a0\u00a0 \/\/\u30a8\u30e9\u30fc\u51e6\u7406\u95a2\u6570\r\n{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 perror(errorMessage);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exit(1);\r\n}\r\n\r\nvoid CutCrLf( char *str )\r\n{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 char *p;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if\u00a0\u00a0\u00a0\u00a0 ((p = strchr(str, '\\r')) != NULL) *p = '&#92;&#48;';\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else if((p = strchr(str, '\\n')) != NULL) *p = '&#92;&#48;';\r\n}\r\n\r\nint CutChar( char *data, char *str, char c )\r\n{\r\n\u00a0\u00a0 unsigned int i;\r\n\r\n\u00a0\u00a0 for(i=0; data&#x5B;i] != c; i++)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 str&#x5B;i] = data&#x5B;i];\r\n\r\n\u00a0\u00a0 str&#x5B;i] = '&#92;&#48;';\r\n\r\n\u00a0\u00a0 return i;\r\n}\r\n\r\nvoid GetHtml( FILE *sock_fp, HEAD_DATA *data )\r\n{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FILE *fp;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 char *buf;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 struct stat st;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(stat(data-&gt;path + 1, &amp;st) &lt; 0){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, \"404error\\n\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exit(1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 if((buf = (char *)calloc(st.st_size, sizeof(char))) == NULL){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, \"calloc\\n\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exit(1);\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(sock_fp, \"%s 200 OK\\r\\n\", data-&gt;version);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(sock_fp, \"Server:sample\\r\\n\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(sock_fp, \"Content-Type:text\/html\\r\\n\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(sock_fp, \"Content-Length:%d\\r\\n\", (int)st.st_size);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(sock_fp, \"\\r\\n\");\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if((fp = fopen(data-&gt;path + 1, \"r\")) == NULL){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, \"fopen\\n\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exit(1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 fread(buf, 1, st.st_size, fp);\r\n\u00a0\u00a0\u00a0 fwrite(buf, 1, st.st_size, sock_fp);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 free(buf);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fclose(fp);\r\n\r\n}\r\n\r\nvoid HandleTCPClient(int clntSocket)\r\n{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FILE *sock_fp;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 char *data&#x5B;64], buf&#x5B;2048];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HEAD_DATA headData;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if((sock_fp = fdopen(clntSocket, \"r+\")) == NULL){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, \"fdpoen\\n\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exit(1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 unsigned int len;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 unsigned int i, k;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(i = 0; i &lt; 64; i++){\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fgets(buf, sizeof(buf), sock_fp),\u00a0 (void)CutCrLf(buf);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if((len = strlen(buf)) == 0) break;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if((data&#x5B;i] = (char *)calloc(len + 1, sizeof(char))) == NULL){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, \"calloc\\n\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exit(1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 strcpy(data&#x5B;i], buf);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 k = i;\r\n\r\n#ifdef DEBUG\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"%s\\n\", data&#x5B;0]);\r\n#endif\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 len =\u00a0 CutChar( data&#x5B;0]\u00a0\u00a0\u00a0\u00a0\u00a0 , headData.method,\u00a0\u00a0\u00a0\u00a0 ' '\u00a0 ), len++;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 len += CutChar( data&#x5B;0] + len, headData.path,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ' '\u00a0 ), len++;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 len += CutChar( data&#x5B;0] + len, headData.version,\u00a0\u00a0\u00a0 '&#92;&#48;' ), len++;\r\n\r\n#ifdef DEBUG\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"%s %s %s\\n\", headData.method, headData.path, headData.version);\r\n#endif\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(strstr(\"headData.version\" , \"1.0\") != NULL || strstr(\"headData.version\" , \"1.1\") != NULL){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, \"request error\\n\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exit(1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GetHtml(sock_fp, &amp;headData);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fflush(sock_fp);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(i=0; i &lt; k; i++){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"%s\", data&#x5B;i]);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 free(data&#x5B;i]);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n}\r\n\r\nint main(int argc, char *argv&#x5B;])\r\n{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int servSock;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u30b5\u30fc\u30d0\u306e\u30bd\u30b1\u30c3\u30c8\u30c7\u30a3\u30b9\u30af\u30ea\u30d7\u30bf\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int clntSock;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u30bd\u30b1\u30c3\u30c8\u30c7\u30a3\u30b9\u30af\u30ea\u30d7\u30bf\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 struct sockaddr_in echoClntAddr;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30a2\u30c9\u30ec\u30b9\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pthread_t threadID;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 struct ThreadArgs *threadArgs;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 unsigned short echoServPort;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u30b5\u30fc\u30d0\u30dd\u30fc\u30c8\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 unsigned int clntLen;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u30a2\u30c9\u30ec\u30b9\u69cb\u9020\u4f53\u306e\u9577\u3055\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(argc != 2)\u00a0\u00a0 \/\/\u5f15\u6570\u306e\u6570\u3092\u30c1\u30a7\u30c3\u30af\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, \"Usage: %s &lt;Server Port&gt;\\n\", argv&#x5B;0]);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exit(1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 echoServPort = atoi(argv&#x5B;1]);\u00a0\u00a0 \/\/\u30ed\u30fc\u30ab\u30eb\u30dd\u30fc\u30c8\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 servSock = CreateTCPServerSocket(echoServPort);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(;;) \/\/\u7e70\u308a\u8fd4\u3057\u5b9f\u884c\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u5165\u51fa\u529b\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u30b5\u30a4\u30ba\u3092\u305b\u3063\u3068\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clntLen = sizeof(echoClntAddr);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clntSock = AcceptTCPConnection(servSock);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ((threadArgs = (struct ThreadArgs *) malloc(sizeof(struct ThreadArgs))) == NULL)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DieWithError(\"malloc() failed\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 threadArgs -&gt; clntSock = clntSock;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, \"1:tid = %d\\n\", gettid());\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* Create client thread *\/\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (pthread_create(&amp;threadID, NULL, ThreadMain, (void *) threadArgs) != 0)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DieWithError(\"pthread_create() failed\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pthread_join(threadID, NULL);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 close(clntSock);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"with thread %ld\\n\", (long int) threadID);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u3053\u306e\u90e8\u5206\u306b\u306f\u5230\u9054\u3057\u306a\u3044\r\n}\r\n\r\nvoid *ThreadMain(void *threadArgs)\r\n{\r\n\u00a0\u00a0\u00a0 int clntSock;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* Socket descriptor for client connection *\/\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fprintf(stderr, \"2:tid=%d\\n\", gettid());\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clntSock = ((struct ThreadArgs *) threadArgs) -&gt; clntSock;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 free(threadArgs);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HandleTCPClient(clntSock);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return(NULL);\r\n}\r\n<\/pre>\n<p>\u3042\u3068\u306f\u30c7\u30d0\u30c3\u30b0\u3092\u3057\u3066\u3044\u305f\u6642\u306b\u51e6\u7406\u304c\u5909\u306a\u3068\u3053\u308d\u3067\u6b62\u307e\u3063\u305f\u308a\u3057\u3066\u3044\u305f\u306e\u3067\u3001Debug\u7528\u306bprintf\u3092\u3044\u308d\u3093\u306a\u3068\u3053\u308d\u306b\u5165\u308c\u3066\u505c\u6b62\u306e\u30bf\u30a4\u30df\u30f3\u30b0\u3092\u78ba\u8a8d\u3057\u307e\u3057\u305f\u3002<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;stdio.h&gt;\u00a0\u00a0\u00a0\u00a0\u00a0 \/* for printf() *\/\r\n#include &lt;sys\/socket.h&gt; \/* for accept() *\/\r\n#include &lt;arpa\/inet.h&gt;\u00a0 \/* for sockaddr_in and inet_ntoa() *\/\r\n\r\nvoid DieWithError(char *errorMessage);\u00a0 \/* Error handling function *\/\r\n\r\nint AcceptTCPConnection(int servSock)\r\n{\r\n\u00a0\u00a0\u00a0\u00a0 int clntSock;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* Socket descriptor for client *\/\r\n\u00a0\u00a0\u00a0\u00a0 struct sockaddr_in echoClntAddr; \/* Client address *\/\r\n\u00a0\u00a0\u00a0\u00a0 unsigned int clntLen;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* Length of client address data structure *\/\r\n\r\n\u00a0\u00a0\u00a0\u00a0 printf(\"\u3046\u306b\\n\");\r\n\u00a0\u00a0\u00a0\u00a0 \/* Set the size of the in-out parameter *\/\r\n\u00a0\u00a0\u00a0\u00a0 clntLen = sizeof(echoClntAddr);\r\n\r\n\u00a0\u00a0\u00a0\u00a0 printf(\"\u3044\u304f\u3089\\n\");\r\n\u00a0\u00a0\u00a0\u00a0 \/* Wait for a client to connect *\/\r\n\u00a0\u00a0\u00a0\u00a0 if ((clntSock = accept(servSock, (struct sockaddr *) &amp;echoClntAddr,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &amp;clntLen)) &lt; 0)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DieWithError(\"accept() failed\");\r\n\r\n\u00a0\u00a0\u00a0\u00a0 printf(\"\u306a\u307e\u3053\\n\");\r\n\u00a0\u00a0\u00a0\u00a0 \/* clntSock is connected to a client! *\/\r\n\r\n\u00a0\u00a0\u00a0\u00a0 printf(\"Handling client %s\\n\", inet_ntoa(echoClntAddr.sin_addr));\r\n\r\n\u00a0\u00a0\u00a0\u00a0 return clntSock;\r\n }\r\n<\/pre>\n<p>gdb\u3067\u540c\u3058\u3053\u3068\u304c\u3067\u304d\u308b\u306e\u3067\u3001\u308f\u308a\u3068\u7c21\u5358\u306a\u65b9\u6cd5\u306a\u3093\u3067\u3084\u3063\u3061\u3083\u3044\u307e\u3057\u305f\u3002\u306a\u304a#define\u306e\u3068\u3053\u308d\u306f\u3044\u307e\u3044\u3061\u3088\u304f\u5206\u304b\u3063\u3066\u307e\u305b\u3093\u3002<\/p>\n<p>\u30b5\u30fc\u30d0\u30fc\u5074\u3067\u52d5\u304b\u3057\u3066\u3001\u30a6\u30a7\u30d6\u304b\u3089\u30a2\u30af\u30bb\u30b9\u3057\u305f\u6642\u306e\u52d5\u4f5c\u306f\u4e0b\u306e\u3088\u3046\u306a\u611f\u3058\u3067\u3059\u3002<br \/>\n1\u56de\u30a2\u30af\u30bb\u30b9\u3057\u305f\u5f8c\u306f\u3001\u300c\u3044\u304f\u3089\u300d\u306e\u8868\u793a\u3067\u6b62\u307e\u308a\u307e\u3059\u3002<br \/>\naccept\u3067\u5f85\u3063\u3066\u308b\u3063\u3066\u3053\u3068\u3067\u3059\u306d\u3002<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n&#x5B;root@testserver_centos ~]# .\/TCPWebServer_type_Thread 8000\r\n\u3046\u306b\r\n\u3044\u304f\u3089\r\n\u306a\u307e\u3053\r\nHandling client 192.168.24.53\r\n1:tid = 14387\r\n2:tid=14430\r\nGET \/index.html HTTP\/1.1Host: 192.168.24.61:8000\r\nUser-Agent: Mozilla\/5.0 (Windows NT 6.3; WOW64; rv:28.0) Gecko\/20100101 Firefox\/28.0\r\nAccept: text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8Accept-Language: ja,en-us;q=0.7,en;q=0.3\r\nAccept-Encoding: gzip, deflateCookie: _ga=GA1.4.2104063878.1399427134Connection: keep-aliveCache-Control: max-age=0\r\nwith thread 139711973316352\r\n\u3046\u306b\r\n\u3044\u304f\u3089\r\n\u306a\u307e\u3053\r\nHandling client 192.168.24.53\r\n1:tid = 14387\r\n2:tid=14461\r\nGET \/index.html HTTP\/1.1Host: 192.168.24.61:8000User-Agent: Mozilla\/5.0 (Windows NT 6.3; WOW64; rv:28.0) Gecko\/20100101 Firefox\/28.0\r\nAccept: text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8Accept-Language: ja,en-us;q=0.7,en;q=0.3\r\nAccept-Encoding: gzip, deflateCookie: _ga=GA1.4.2104063878.1399427134Connection: keep-aliveCache-Control: max-age=0\r\nwith thread 139711973316352\r\n\u3046\u306b\r\n\u3044\u304f\u3089\r\n\u306a\u307e\u3053\r\nHandling client 192.168.24.53\r\n1:tid = 14387\r\n2:tid=14492\r\nGET \/index.html HTTP\/1.1Host: 192.168.24.61:8000User-Agent: Mozilla\/5.0 (Windows NT 6.3; WOW64; rv:28.0) Gecko\/20100101 Firefox\/28.0\r\nAccept: text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8Accept-Language: ja,en-us;q=0.7,en;q=0.3\r\nAccept-Encoding: gzip, deflateCookie: _ga=GA1.4.2104063878.1399427134Connection: keep-aliveCache-Control: max-age=0\r\nwith thread 139711973316352\r\n\u3046\u306b\r\n\u3044\u304f\u3089\r\n\u306a\u307e\u3053\r\nHandling client 192.168.24.53\r\n1:tid = 14387\r\n2:tid=14493\r\nGET \/index.html HTTP\/1.1Host: 192.168.24.61:8000User-Agent: Mozilla\/5.0 (Windows NT 6.3; WOW64; rv:28.0) Gecko\/20100101 Firefox\/28.0\r\nAccept: text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8Accept-Language: ja,en-us;q=0.7,en;q=0.3\r\nAccept-Encoding: gzip, deflateCookie: _ga=GA1.4.2104063878.1399427134Connection: keep-aliveCache-Control: max-age=0\r\nwith thread 139711973316352\r\n\u3046\u306b\r\n\u3044\u304f\u3089\r\n^C\r\n<\/pre>\n<p>socnet\u306b\u3064\u3044\u3066\u601d\u3044\u8fd4\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p>socket\u30fb\u30bd\u30b1\u30c3\u30c8\u3092\u751f\u6210\u3000\u2192<br \/>\nbind\u30fb\u30bd\u30b1\u30c3\u30c8\u306e\u30d0\u30a4\u30f3\u30c9\u3000\u2192<br \/>\nlisten\u30fb\u63a5\u7d9a\u6e96\u5099\u3000\u2192<br \/>\naccept\u30fb\u63a5\u7d9a\u5f85\u6a5f<\/p>\n<p>\u3068\u3044\u3046\u4e8b\u3067\u3057\u305f\u306e\u3067\u3001\u3053\u308c\u3068\u4e00\u81f4\u3057\u307e\u3059\u306d\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u30b9\u30ec\u30c3\u30c9\u306a\u306e\u3067\u4f55\u56de\u30ea\u30ed\u30fc\u30c9\u3057\u3066\u3082\u3001\u30d7\u30ed\u30bb\u30b9\u306e\u6570\u306f\u5897\u3048\u306a\u3044\u3002<br \/>\n\u30d6\u30e9\u30a6\u30b6\u304b\u3089\u540c\u6642\u306b\uff13\u3064\u30a2\u30af\u30bb\u30b9\u3057\u3066\u307f\u305f\u3089\u3001\u30b9\u30ec\u30c3\u30c9ID\u304c\u5897\u3048\u308b\u3060\u3051\u3067\u30d7\u30ed\u30bb\u30b9\u306f1\u500b\u306e\u72b6\u614b\u304c\u7d9a\u304d\u307e\u3057\u305f\u3002<\/p>\n<p>\u5b9f\u9a13\u6210\u529f\u3063\u3059\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u61f8\u5ff5\u70b9\u306f\u3001\u52d5\u4f5c\u3059\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u306f\u3067\u304d\u305f\u3051\u308c\u3069\u3001Pthread\u306b\u3064\u3044\u3066\u306e\u52c9\u5f37\u304c\u8db3\u308a\u3066\u3044\u306a\u3044\u3053\u3068\u3084\u3001Define\u3067\u5b9a\u7fa9\u3057\u3066\u3044\u308b\u3082\u306e\u306f\u3068\u308a\u3042\u3048\u305a\u66f8\u3044\u305f\u3060\u3051(\u7b11)\u306a\u3068\u3053\u3002<\/p>\n<p>\u30b9\u30ec\u30c3\u30c9\u3067\u3053\u3093\u306a\u306b\u6642\u9593\u304c\u304b\u304b\u308b\u3068\u306f\u4e88\u60f3\u3057\u3066\u3044\u306a\u304b\u3063\u305f\u306e\u3067\u3001\u3061\u3087\u3063\u3068\u9a5a\u304d\u3067\u3057\u305f\u3002<br \/>\n\u3053\u3093\u3069Apache\u306eMPM\u3092\u4f8b\u306b\u3057\u3066\u3001\u52c9\u5f37\u3057\u3066\u307f\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>\u6b21\u3067\u6700\u5f8c\u306b\u306a\u308a\u307e\u3059\u5236\u9650\u3064\u304d\u30de\u30eb\u30c1\u30bf\u30b9\u30af\u3067\u3059\u306d\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u3053\u306e\uff14\u304b\u6708\u9593\u3001TCP\/IP \u30bd\u30b1\u30c3\u30c8\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0C\u8a00\u8a9e\u7de8\u3092\u3084\u308b\u305f\u3081\u306bC\u8a00\u8a9e\u306e\u52c9\u5f37\u3092\u3057\u3066\u304d\u305f\u8a33\u3067\u3059\u304c\u3001\u6700\u521d\u306f\u546a\u6587\u306e\u3088\u3046\u306b\u898b\u3048\u305f\u30bd\u30b1\u30c3\u30c8\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u3082\u3001\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u3092\u4f7f\u3063\u3066\u3001\u81ea\u5206\u3067\u69cb\u6210\u3057\u305f\u308a\u307e\u3067\u306f\u3001\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n<p>Perl\u304c\u3001\u3053\u308c\u307e\u305f\u5384\u4ecb\u3067C\u8a00\u8a9e\u3068\u65e5\u672c\u8a9e\u3068\u82f1\u8a9e\u304f\u3089\u3044\u9055\u3063\u3066\u3066\uff57<br \/>\n\u305d\u308d\u305d\u308dPerl\u306e\u65b9\u3092\u3057\u3063\u304b\u308a\u3084\u308a\u305f\u3044\u3068\u601d\u3063\u3066\u3044\u308b\u3093\u3060\u3051\u3069\u3001<span style=\"font-size: 14pt;\">\u3082\u3046\u3061\u3087\u3063\u3068\u3060\u3051\u7d9a\u304f\u306e\u3058\u3083\u3063\u3066\u3084\u3064\u3067<\/span>\u3001\u3082\u3046\u3061\u3087\u3044C\u8a00\u8a9e\u3092\u7d9a\u3051\u3088\u3046\u3068\u601d\u3063\u3066\u308b\u3093\u3060\u306a\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u53c2\u8003\u30b5\u30a4\u30c8<\/p>\n<p><a href=\"http:\/\/cs.ecs.baylor.edu\/~donahoo\/\" target=\"_blank\" rel=\"noopener noreferrer\">Michael J. Donahoo\u3055\u3093\u306e\u30da\u30fc\u30b8<\/a><\/p>\n<p><a href=\"http:\/\/www.geocities.jp\/xsybr354\/debian\/etch\/pthread.html\" target=\"_blank\" rel=\"noopener noreferrer\">pthread \u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u8981\u9805<\/a><\/p>\n<div class='wp_social_bookmarking_light'>        <div class=\"wsbl_twitter\"><a href=\"https:\/\/twitter.com\/share\" class=\"twitter-share-button\" data-url=\"https:\/\/www.vincentina.net\/?p=4145\" data-text=\"\u3053\u306a\u3044\u3060\u4f5c\u3063\u305f\u7c21\u6613Web\u30b5\u30fc\u30d0\u30fc\u3092\u30de\u30eb\u30c1\u30bf\u30b9\u30af\u5316\u3059\u308b\u3088\u3002\uff08\uff12\uff09\" data-via=\"TakekenTw\" data-lang=\"ja\">Tweet<\/a><\/div><\/div>\n<br class='wp_social_bookmarking_light_clear' \/>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u56de\u3084\u3063\u305f\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u6bce\u306b\u30d7\u30ed\u30bb\u30b9\u3092\u4f5c\u6210\u306e\u7d9a\u304d\u3067\u3001\u4eca\u56de\u306f \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u6bce\u306b\u30b9\u30ec\u30c3\u30c9\u3092\u4f5c\u6210 \u3067\u3059\u3002 fork\u3068\u540c\u3058\u611f\u3058\u3067\u3059\u3093\u306a\u308a\u7d42\u308f\u308b\u304b\u306a\u3042\u3068\u601d\u3063\u3066\u305f\u3093\u3067\u3059\u304c\u3001\u3068\u3053\u308d\u304c\u3069\u3063\u3053\u3044\u3060\u3044\u3076\u6642\u9593\u304c\u304b\u304b\u308a\u307e\u3057\u305f\u3002\u4eca\u56de\u3082Echo\u3058\u3083\u306a &hellip; <a href=\"https:\/\/www.vincentina.net\/?p=4145\" class=\"more-link\"><span class=\"screen-reader-text\">&#8220;\u3053\u306a\u3044\u3060\u4f5c\u3063\u305f\u7c21\u6613Web\u30b5\u30fc\u30d0\u30fc\u3092\u30de\u30eb\u30c1\u30bf\u30b9\u30af\u5316\u3059\u308b\u3088\u3002\uff08\uff12\uff09&#8221; \u306e<\/span>\u7d9a\u304d\u3092\u8aad\u3080<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[106],"tags":[],"class_list":["post-4145","post","type-post","status-publish","format-standard","hentry","category-programming"],"_links":{"self":[{"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/posts\/4145","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4145"}],"version-history":[{"count":3,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/posts\/4145\/revisions"}],"predecessor-version":[{"id":7879,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/posts\/4145\/revisions\/7879"}],"wp:attachment":[{"href":"https:\/\/www.vincentina.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4145"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4145"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4145"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}