{"id":141,"date":"2009-11-09T18:39:05","date_gmt":"2009-11-09T18:39:05","guid":{"rendered":"http:\/\/kumouse.aafox.com\/?p=141"},"modified":"2009-11-09T18:39:05","modified_gmt":"2009-11-09T18:39:05","slug":"%e4%b8%80%e4%b8%aa%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%a8%a1%e5%9e%8b%e7%9a%84%e6%b5%8b%e8%af%95%ef%bc%88%e4%be%8b%e5%ad%90%ef%bc%89","status":"publish","type":"post","link":"https:\/\/www.kumouse.com\/?p=141","title":{"rendered":"\u4e00\u4e2a\u670d\u52a1\u5668\u6a21\u578b\u7684\u6d4b\u8bd5\uff08\u4f8b\u5b50\uff09"},"content":{"rendered":"<p>\u670d\u52a1\u5668\u7aef:<br \/>[ssj@main test]$ cat easyserver.c<br \/>#include &lt;stdio.h&gt;<br \/>#include &lt;stdlib.h&gt;<br \/>#include &lt;unistd.h&gt;<br \/>#include &lt;ctype.h&gt;<br \/>#include &lt;sys\/socket.h&gt;<br \/>#include &lt;arpa\/inet.h&gt;<br \/>#include &lt;string.h&gt;<br \/>#define MAX 200           \/*\u7f13\u51b2\u533a\u5927\u5c0f*\/<br \/>#define BB 16              \/*IP\u5730\u5740\u957f\u5ea6 IPV4\u662f16,IPV6\u662f28*\/<br \/>void my_turn(char *p)              \/*\u5b57\u7b26\u5904\u7406\u51fd\u6570\uff0c\u5c0f\u5199\u53d8\u5927\u5199\uff0clinux\u4e0b\u6ca1\u6709strupr\u4e86\uff1f\uff1f\uff1f*\/<br \/>{<br \/>if (p == NULL)return;<br \/>while( *p != &#39;\u0000&#39;)<br \/>{<br \/>if( *p &gt;= (char)0x61 &#038;&#038; *p &lt;= (char)0x7a)<br \/>*p=(char)((int)*p-(int)0x20);<br \/>p++;<br \/>}<br \/>}<\/p>\n<p>int main(void)<br \/>{<br \/>struct sockaddr_in sin,cin;              \/*sin\u672c\u5730IP\u5730\u5740\u7ed3\u6784\uff0ccin\u5ba2\u6237\u7aefIP\u5730\u5740\u7ed3\u6784*\/<br \/>int lfd,cfd;                                    \/*lfd\u672c\u5730socket\u5957\u63a5\u5b57\u63cf\u8ff0\u7b26\uff0ccfd\uff0c\u7531accept\u5efa\u7acb\u7684*\/<br \/>socklen_t len;                               \/*\u5ba2\u6237\u7aefIP\u957f\u5ea6*\/<br \/>char buf[MAX];                              \/*\u7f13\u51b2\u533a*\/<br \/>char addr_p[BB];                           \/*IP\u5730\u5740\u5341\u8fdb\u5236\u5b57\u7b26\u4e32*\/<br \/>int port = 65533;                           \/*\u7ed1\u5b9a\u7684\u7aef\u53e3*\/<br \/>int n;                                            \/*\u6536\u5230\u7684\u6570\u636e\u957f\u5ea6*\/<br \/>bzero(&#038;sin,sizeof(sin));                  \/*\u521d\u59cb\u5316sin*\/<br \/>sin.sin_family=AF_INET;                  \/*\u5b9a\u4e49\u4e3aIPV4*\/<br \/>sin.sin_addr.s_addr=INADDR_ANY;    \/*\u670d\u52a1\u5668\u53ef\u4ee5\u63a5\u53d7\u4efb\u610f\u5730\u5740*\/<br \/>sin.sin_port=htons(port);                  \/*\u628aIP\u5730\u5740\u8f6c\u670916\u4f4d\u5b57\u8282\u5e8f\uff0c\u5e76\u8d4b\u503c*\/<\/p>\n<p>lfd=socket(AF_INET,SOCK_STREAM,0);              \/*\u5efa\u7acb\u5957\u63a5\u5b57*\/<br \/>bind(lfd,(struct sockaddr *)&#038;sin,sizeof(sin));     \/*\u7ed1\u5b9a\u7aef\u53e3\u4e0e\u5957\u63a5\u5b57*\/<br \/>listen(lfd,10);                                                 \/*\u76d1\u542c\uff0c\u5e76\u8bbe\u7f6e\u6700\u5927\u961f\u5217\u4e3a10*\/               <br \/>printf(&quot;running&#8230;&#8230;&#8230;.n&quot;);<\/p>\n<p>while(1)                                                         \/*\u5faa\u73af\u5904\u7406\u5ba2\u6237\u7684\u8fde\u63a5\u8bf7\u6c42*\/<br \/>{<br \/>cfd=accept(lfd,(struct sockaddr *)&#038;cin,&#038;len);<br \/>n=read(cfd,buf,MAX);<br \/>inet_ntop(AF_INET,&#038;cin.sin_addr,addr_p,sizeof(addr_p));<br \/>printf(&quot;client IP is:%s:%d size:%dn&quot;,addr_p,ntohs(cin.sin_port),n);<br \/>if (strcmp(buf,&quot;close&quot;)==0)                                                           <span style=\"color:Red\">\/*\u662f\u5426\u9000\u51fa*\/ <\/span><br \/>{<br \/>write(cfd,&quot;server done&quot;,12);<br \/>close(cfd);<br \/>close(lfd);<br \/>printf(&quot;server done.n&quot;);<br \/>exit(0);<br \/>}<br \/>printf(&quot;type:%sn&quot;,buf);<br \/>my_turn(buf);<br \/>printf(&quot;turn type:%sn=================================n&quot;,buf);<br \/>write(cfd,buf,n);<br \/>close(cfd);<br \/>}<br \/>if(close(lfd)==-1)    <span style=\"color:Red\">\/*\u6536\u5c3e\uff0c\u5b9e\u9645\u4e0a\uff0c\u4e0a\u8fb9\u7684while\u662f\u4e2a\u6b7b\u5faa\u73af\uff0c\u7528ctrl+c\u9000\u51fa\uff0c\u6216\u7528close\u9000\u51fa\uff0c\u90fd\u6267\u884c\u4e0d\u5230\u8fd9\u91cc*\/ <\/span> <br \/>{<br \/>perror(&quot;fail close&quot;);<br \/>exit(1);<br \/>}<br \/>return 0;<br \/>}<\/p>\n<p>\u5ba2\u6237\u7aef:<br \/>[ssj@main test]$ cat easyclient.c<br \/>#include &lt;stdio.h&gt;<br \/>#include &lt;unistd.h&gt;<br \/>#include &lt;sys\/types.h&gt;<br \/>#include &lt;sys\/socket.h&gt;<br \/>#include &lt;arpa\/inet.h&gt;<br \/>#include &lt;string.h&gt;<br \/>#define MAX 200<\/p>\n<p>int main(int argc,char * argv[])<br \/>{<br \/>struct sockaddr_in pin;<br \/>struct sockaddr_in *apin=&pin;<br \/>char buf[MAX];<br \/>int sfd,port=65533;<br \/>char *str=&quot;ssj test&quot;;<\/p>\n<p>if (argc&gt;1)<br \/>{<br \/>str=argv[1];<br \/>}<br \/>bzero(&#038;pin,sizeof(pin));<br \/>pin.sin_family=AF_INET;<br \/>inet_pton(AF_INET,&quot;127.0.0.1&quot;,&#038;pin.sin_addr);<br \/>pin.sin_port=htons(port);<\/p>\n<p>sfd=socket(AF_INET,SOCK_STREAM,0);<br \/>connect(sfd,(struct sockaddr *)&#038;pin,sizeof(pin));<br \/>write(sfd,str,strlen(str)+1);<br \/>read(sfd,buf,MAX);<br \/>printf(&quot;recive:%sn&quot;,buf);<br \/>close(sfd);<br \/>return 0;<br \/>}<\/p>\n<p>======================================<br \/>\u66f4\u5b8c\u5584\u7684\u4e00\u4e2a\u7248\u672c\uff08\u670d\u52a1\u5668\uff09<br \/>[ssj@main test]$ cat easyserver.c<br \/>#include &lt;stdio.h&gt;<br \/>#include &lt;stdlib.h&gt;<br \/>#include &lt;unistd.h&gt;<br \/>#include &lt;ctype.h&gt;<br \/>#include &lt;sys\/socket.h&gt;<br \/>#include &lt;arpa\/inet.h&gt;<br \/>#include &lt;string.h&gt;<br \/>#include &quot;ssjio.c&quot;<br \/>#define MAX 200<br \/>#define BB 16<br \/>void my_turn(char *p)<br \/>{<br \/>if (p == NULL)return;<br \/>while( *p != &#39;\u0000&#39;)<br \/>{<br \/>if( *p &gt;= (char)0x61 &#038;&#038; *p &lt;= (char)0x7a)<br \/>*p=(char)((int)*p-(int)0x20);<br \/>p++;<br \/>}<br \/>}<\/p>\n<p>int main(void)<br \/>{<br \/>struct sockaddr_in sin,cin;<br \/>int lfd,cfd;<br \/>socklen_t len;<br \/>char buf[MAX];<br \/>char addr_p[BB];<br \/>int port = 65533;<br \/>int n;<br \/>bzero(&#038;sin,sizeof(sin));<br \/>sin.sin_family=AF_INET;<br \/>sin.sin_addr.s_addr=INADDR_ANY;<br \/>sin.sin_port=htons(port);<\/p>\n<p>if((lfd=socket(AF_INET,SOCK_STREAM,0))==-1)<br \/>{<br \/>perror(&quot;Fail to create socket&quot;);<br \/>exit(1);<br \/>}<\/p>\n<p>if(bind(lfd,(struct sockaddr *)&#038;sin,sizeof(sin))==-1)<br \/>{<br \/>perror(&quot;Fail to bind&quot;);<br \/>exit(1);<br \/>}<br \/>if(listen(lfd,10)==-1)<br \/>{<br \/>perror(&quot;Fail to listen&quot;);<br \/>exit(1);<br \/>}<br \/>printf(&quot;running&#8230;&#8230;&#8230;.n&quot;);<\/p>\n<p>while(1)<br \/>{<br \/>if((cfd=accept(lfd,(struct sockaddr *)&#038;cin,&#038;len))==-1)<br \/>{<br \/>perror(&quot;Fail to accept&quot;);<br \/>exit(1);<br \/>}<\/p>\n<p>n=ssj_read(cfd,buf,MAX);<br \/>if (n==-1)<br \/>  exit(1);<br \/>else if(n==0)<br \/>  {<br \/>   printf(&quot;the connect closedn&quot;);<br \/>   close(cfd);<br \/>   continue;<br \/>  }<\/p>\n<p>inet_ntop(AF_INET,&#038;cin.sin_addr,addr_p,sizeof(addr_p));<br \/>printf(&quot;client IP is:%s:%d size:%dn&quot;,addr_p,ntohs(cin.sin_port),n);<br \/>if (strcmp(buf,&quot;close&quot;)==0)<br \/>{<br \/>n=ssj_write(cfd,&quot;server done&quot;,12);<br \/>if(n==-1)<br \/>exit(1);<br \/>close(cfd);<br \/>close(lfd);<br \/>printf(&quot;server done.n&quot;);<br \/>exit(0);<br \/>}<br \/>printf(&quot;type:%sn&quot;,buf);<br \/>my_turn(buf);<br \/>printf(&quot;turn type:%sn=================================n&quot;,buf);<br \/>n=ssj_write(cfd,buf,n);<br \/>if(n==-1)<br \/>exit(1);<\/p>\n<p>if(close(cfd)==-1)<br \/>{<br \/>perror(&quot;Fail to close&quot;);<br \/>exit(1);<br \/>}<br \/>}<br \/>if(close(lfd)==-1)<br \/>{<br \/>perror(&quot;fail close&quot;);<br \/>exit(1);<br \/>}<br \/>return 0;<br \/>}<\/p>\n<p>\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d\uff1d<br \/>[ssj@main test]$ cat ssjio.c<br \/>#include &lt;errno.h&gt;<br \/>#include &lt;fcntl.h&gt;<br \/>#include &lt;unistd.h&gt;<\/p>\n<p>ssize_t ssj_read(int fd,void *buf,size_t length)<br \/>{<br \/>ssize_t done=length;<br \/>done=read(fd,buf,length);<br \/>return done;<br \/>}<\/p>\n<p>ssize_t ssj_write(int fd,void *buf,size_t length)<br \/>{<br \/>ssize_t done=length;<br \/>while(done&gt;0)<br \/>{<br \/>done=write(fd,buf,length);<br \/>if(done!=length)<br \/>  if (errno==EINTR)<br \/>    done=length;<br \/>  else{<br \/>    perror(&quot;Fail to write&quot;);<br \/>    return -1;<br \/>    }<br \/>else<br \/>  break;<br \/>}<br \/>return done;<br \/>}<\/p>\n<p>\u5ba2\u6237\u7aef\u540c\u7406<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u670d\u52a1\u5668\u7aef:[ssj@main test]$ cat easyserver.c#include &lt;stdi [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-141","post","type-post","status-publish","format-standard","hentry","category-linux-c"],"_links":{"self":[{"href":"https:\/\/www.kumouse.com\/index.php?rest_route=\/wp\/v2\/posts\/141","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kumouse.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kumouse.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=141"}],"version-history":[{"count":0,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=\/wp\/v2\/posts\/141\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.kumouse.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=141"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=141"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=141"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}