{"id":5079,"date":"2024-01-13T19:30:11","date_gmt":"2024-01-13T11:30:11","guid":{"rendered":"https:\/\/www.kenpai.com\/cms\/5079\/"},"modified":"2024-01-13T19:30:11","modified_gmt":"2024-01-13T11:30:11","slug":"%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8e%e5%ae%a2%e6%88%b7%e7%ab%af%e7%ae%80%e5%8d%95%e9%80%9a%e4%bf%a1-server","status":"publish","type":"post","link":"https:\/\/www.kenpai.com\/cms\/5079\/","title":{"rendered":"\u670d\u52a1\u5668\u4e0e\u5ba2\u6237\u7aef\u7b80\u5355\u901a\u4fe1  \u2014\u2014server"},"content":{"rendered":"<\/p>\n<p>#include &lt;stdio.h&gt;<br \/>#include &lt;sys\/types.h&gt;<br \/>#include &lt;sys\/socket.h&gt;<br \/>#include &lt;strings.h&gt;<br \/>#include &lt;arpa\/inet.h&gt;<br \/>#include &lt;unistd.h&gt;<br \/>#include &lt;string.h&gt;<\/p>\n<p>#define SERV_PORT 9000<\/p>\n<p>#define BUFF_SIZE 1024<\/p>\n<p>struct user<br \/>{<br \/>int socketfd;<br \/>char name[20];<br \/>char toName[20];<br \/>int result; \/\/ 0 \u4ee3\u8868\u5931\u8d25 1\u4ee3\u8868\u6210\u529f 2 \u4ee3\u8868\u522b\u4eba\u7ed9\u4f60\u53d1\u7684\u4fe1\u606f 3\u4ee3\u8868\u6ca1\u6ce8\u518c 4\u9519\u8bef\u7684\u6307\u4ee4<br \/>char msg[100];<br \/>int cmd; \/\/ 5 \u4ee3\u8868\u6ce8\u518c\u7528\u6237 10 \/\/ \u4ee3\u8868\u53d1\u9001\u4fe1\u606f<br \/>};<\/p>\n<p>struct userManage<br \/>{<br \/>int flag[20];  \/\/ \u8868\u660e\u54ea\u4e2a\u7a7a\u7f3a<br \/>struct user users[20];<br \/>};<\/p>\n<p>pthread_mutex_t mutex;<\/p>\n<p>struct userManage uMge;<br \/>void save_user(int socket_fd, struct user * userInfo)<br \/>{<br \/>pthread_mutex_lock(&amp;mutex);<br \/>int i = 0;<br \/>for (i = 0; i &lt; 20; i  )<br \/>{<br \/>if (uMge.flag[i] == 1)<br \/>{<br \/>continue;<br \/>}<br \/>uMge.users[i].socketfd = socket_fd;<br \/>strcpy(uMge.users[i].name, userInfo-&gt;name);<br \/>userInfo-&gt;result = 1;<br \/>uMge.flag[i] = 1;<br \/>printf (&quot;%s register success!n&quot;, uMge.users[i].name);<br \/>break;<br \/>}<br \/>pthread_mutex_unlock(&amp;mutex);<br \/>}<\/p>\n<p>int server_request(int cfd)<br \/>{<br \/>int readSize, writeSize;<br \/>int ret = 0;<br \/>int i;<br \/>struct user userInfo;<br \/>int toname_fd = -1;<br \/>int isRegister = -1;<br \/>while (readSize = read(cfd, &amp;userInfo, sizeof(userInfo)))<br \/>{<br \/>if (readSize == -1)<br \/>{<br \/>perror(&quot;read&quot;);<br \/>return -1;<br \/>}<br \/>if (userInfo.cmd == 5)       \/\/ \u6ce8\u518c\u7528\u6237<br \/>{<br \/>save_user(cfd, &amp;userInfo);   \/\/ \u5c06\u7528\u6237\u4fe1\u606f\u8fdb\u884c\u4fdd\u5b58<br \/>}<\/p>\n<p>else if (userInfo.cmd == 10) \/\/ \u53d1\u9001\u4fe1\u606f<br \/>{<br \/>\/\/ \u68c0\u6d4b\u8be5\u7528\u6237\u662f\u5426\u6ce8\u518c<br \/>for (i = 0; i &lt; 20; i  )<br \/>{<br \/>if (uMge.flag[i] == 1)<br \/>{<br \/>if (uMge.users[i].socketfd == cfd)<br \/>{<br \/>if (strcmp(uMge.users[i].name, userInfo.name) == 0)<br \/>{<br \/>isRegister = 1;<br \/>}<br \/>}<br \/>}<br \/>}<br \/>if(isRegister == 1)<br \/>{<br \/>\/\/ \u5bfb\u627e\u8981\u53d1\u9001\u7684\u7528\u6237<br \/>for (i = 0; i &lt; 20; i  )<br \/>{<br \/>if (uMge.flag[i] == 1)<br \/>{<br \/>\/\/ \u627e\u5230\u4e86\u8981\u53d1\u9001\u7684\u7528\u6237\uff0c\u5c06\u5176socket\u4fdd\u5b58\u8d77\u6765<br \/>if (strcmp(uMge.users[i].name, userInfo.toName) == 0)<br \/>{<br \/>toname_fd = uMge.users[i].socketfd;<br \/>}<br \/>}<br \/>}<br \/>if(toname_fd != -1) \/\/ \u6ca1\u627e\u5230\u8981\u53d1\u9001\u7684\u7528\u6237<br \/>{<br \/>userInfo.result = 2;  \/\/ \u627e\u5230\u7528\u6237\u5c06\u5176\u8fd4\u56de\u72b6\u6001\u6807\u4e3a1<br \/>writeSize = write(toname_fd, &amp;userInfo, sizeof(userInfo));<br \/>if (writeSize == -1)<br \/>{<br \/>perror(&quot;write&quot;);<br \/>return -1;<br \/>}<\/p>\n<p>printf (&quot;%s send msg to %s : %sn&quot;, userInfo.name, userInfo.toName, userInfo.msg);<br \/>userInfo.result = 1; \/\/ \u53d1\u9001\u6210\u529f<br \/>}<br \/>}<br \/>else<br \/>{<br \/>userInfo.result = 3; \/\/ \u6ca1\u6709\u6ce8\u518c<br \/>}<br \/>} <br \/>else<br \/>{<br \/>userInfo.result = 4; \/\/ \u9519\u8bef\u7684\u6307\u4ee4<br \/>}<\/p>\n<p>writeSize = write(cfd, &amp;userInfo, sizeof(userInfo));<br \/>if (writeSize == -1)<br \/>{<br \/>perror(&quot;write&quot;);<br \/>return -1;<br \/>}<br \/>memset(userInfo.msg, 0, sizeof(userInfo.msg));<br \/>}<\/p>\n<p>}<\/p>\n<p>int main()<br \/>{<br \/>int listen_sockfd;<br \/>int ret;<br \/>struct sockaddr_in server_addr; \/\/ \u670d\u52a1\u5668\u5730\u5740\u7ed3\u6784<br \/>struct sockaddr_in client_addr; \/\/ \u5ba2\u6237\u7aef\u7684\u5730\u5740<\/p>\n<p>pthread_mutex_init(&amp;mutex, NULL);<\/p>\n<p>\/\/ \u521b\u5efa\u76d1\u542c\u5957\u63a5\u5b57<br \/>listen_sockfd = socket(AF_INET, SOCK_STREAM, 0);<br \/>if (listen_sockfd == -1)<br \/>{<br \/>perror(&quot;create socket error&quot;);<br \/>return -1;<br \/>}<\/p>\n<p>\/\/ \u521d\u59cb\u5316\u670d\u52a1\u5668\u5730\u5740\u7ed3\u6784<br \/>bzero(&amp;server_addr, sizeof(server_addr));     \/\/ \u5c06\u5730\u5740\u7ed3\u6784\u53d8\u91cf\u6e05\u96f6<br \/>server_addr.sin_family = AF_INET;         \/\/ \u9009\u62e9IPV4\u5730\u5740<br \/>server_addr.sin_addr.s_addr = htonl(INADDR_ANY);  \/\/ \u76d1\u542c\u672c\u5730\u4efb\u610fIP\u5730\u5740<br \/>server_addr.sin_port = htons(SERV_PORT);      \/\/ \u5c06\u672c\u5730\u7aef\u53e3\u53f7\u8f6c\u5316\u4e3a\u7f51\u7edc\u7aef\u53e3\u53f7<\/p>\n<p>\/\/ \u7ed1\u5b9a\u672c\u5730\u5730\u5740\u548c\u7aef\u53e3\u53f7<br \/>ret = bind(listen_sockfd, (struct sockaddr *)&amp;server_addr, sizeof (server_addr));<br \/>if (ret == -1)<br \/>{<br \/>perror (&quot;bind error&quot;);<br \/>return -1;<br \/>}<\/p>\n<p>\/\/ \u76d1\u542c\u5957\u63a5\u5b57<br \/>ret = listen(listen_sockfd, 20);<br \/>if (ret == -1)<br \/>{<br \/>perror(&quot;listen error&quot;);<br \/>return -1;<br \/>}<\/p>\n<p>while(1)<br \/>{<br \/>int clientfd;<br \/>socklen_t client_len = sizeof(client_addr);<\/p>\n<p>clientfd = accept(listen_sockfd, (struct sockaddr *)&amp;client_addr, &amp;client_len);<br \/>if (clientfd == -1)<br \/>{<br \/>perror(&quot;accept error&quot;);<br \/>return -1;<br \/>} <\/p>\n<p>pthread_t tid;<br \/>\/\/ \u521b\u5efa\u7ebf\u7a0b\u5904\u7406\u5ba2\u6237\u7aef\u8bf7\u6c42<br \/>int ret = pthread_create(&amp;tid, NULL, server_request, (void *)clientfd);<br \/>if (ret != 0)<br \/>{<br \/>printf (&quot;create pthread error!n&quot;);<br \/>return -1;<br \/>}<br \/>pthread_detach(tid); \/\/ \u7ebf\u7a0b\u5206\u79bb<br \/>}<\/p>\n<p>pthread_mutex_destroy(&amp;mutex);<\/p>\n<p>return 0;<br \/>}\u66f4\u591a\u5173\u4e8e\u4e91\u670d\u52a1\u5668\uff0c<span class='wp_keywordlink'><a href=\"https:\/\/www.kenpai.com\/domain.html\" title=\"\u57df\u540d\u6ce8\u518c\" target=\"_blank\">\u57df\u540d<\/a><\/span>\u6ce8\u518c\uff0c\u865a\u62df\u4e3b\u673a\u7684\u95ee\u9898\uff0c\u8bf7\u8bbf\u95ee<span class='wp_keywordlink'><a href=\"https:\/\/www.kenpai.com\/\" title=\"\u57a6\u6d3e\u79d1\u6280\u5b98\u7f51\" target=\"_blank\">\u57a6\u6d3e\u79d1\u6280<\/a><\/span>\u5b98\u7f51\uff1a<span class='wp_keywordlink'><a href=\"https:\/\/www.kenpai.com\/\" title=\"\u57a6\u6d3e\u79d1\u6280\u5b98\u7f51\" target=\"_blank\">www.kenpai.com<\/a><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>#include &lt;stdio.h&gt;#include &lt;sys\/types.h&gt;#include &lt;sys\/socket.<\/p>\n","protected":false},"author":2,"featured_media":4350,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3322],"tags":[3949],"class_list":["post-5079","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ktougao","tag--server"],"_links":{"self":[{"href":"https:\/\/www.kenpai.com\/cms\/wp-json\/wp\/v2\/posts\/5079","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kenpai.com\/cms\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kenpai.com\/cms\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kenpai.com\/cms\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kenpai.com\/cms\/wp-json\/wp\/v2\/comments?post=5079"}],"version-history":[{"count":0,"href":"https:\/\/www.kenpai.com\/cms\/wp-json\/wp\/v2\/posts\/5079\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kenpai.com\/cms\/wp-json\/wp\/v2\/media\/4350"}],"wp:attachment":[{"href":"https:\/\/www.kenpai.com\/cms\/wp-json\/wp\/v2\/media?parent=5079"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kenpai.com\/cms\/wp-json\/wp\/v2\/categories?post=5079"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kenpai.com\/cms\/wp-json\/wp\/v2\/tags?post=5079"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}