{"id":143,"date":"2009-11-11T15:41:04","date_gmt":"2009-11-11T15:41:04","guid":{"rendered":"http:\/\/kumouse.aafox.com\/?p=143"},"modified":"2009-11-11T15:41:04","modified_gmt":"2009-11-11T15:41:04","slug":"%e4%b8%80%e4%b8%aa%e9%9d%9e%e9%98%bb%e5%a1%9e%e6%96%b9%e5%bc%8f%e7%9a%84%e7%bd%91%e7%bb%9c%e7%a8%8b%e5%ba%8f%e6%a8%a1%e5%9e%8budp","status":"publish","type":"post","link":"https:\/\/www.kumouse.com\/?p=143","title":{"rendered":"\u4e00\u4e2a\u975e\u963b\u585e\u65b9\u5f0f\u7684\u7f51\u7edc\u7a0b\u5e8f\u6a21\u578b(UDP)"},"content":{"rendered":"<p>\u670d\u52a1\u5668\u7aef\uff1a<\/p>\n<blockquote><p>[ssj@main test]$ cat noneasyserver.c<br \/>#include &lt;stdio.h&gt;<br \/>#include &lt;string.h&gt;<br \/>#include &lt;unistd.h&gt;<br \/>#include &lt;ctype.h&gt;<br \/>#include &lt;sys\/socket.h&gt;<br \/>#include &lt;netinet\/in.h&gt;<br \/>#include &lt;arpa\/inet.h&gt;<br \/>#include &lt;stdlib.h&gt;<br \/>#include &lt;errno.h&gt;<br \/>#include &lt;unistd.h&gt;<br \/>#include &lt;fcntl.h&gt;<\/p>\n<p>#define MAX 80<\/p>\n<p>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 sfd;<br \/>  int port=65533;<br \/>  socklen_t addr_len;<br \/>  char buf[MAX];<br \/>  char addr_p[INET_ADDRSTRLEN];<br \/>  int n,n1,flags;<\/p>\n<p>  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>  sfd=socket(AF_INET,SOCK_DGRAM,0);<br \/>  if(sfd==-1)<br \/>  {<br \/>    perror(&quot;Fail to socket&quot;);<br \/>    exit(1);<br \/>  }<\/p>\n<p>  if(bind(sfd,(struct sockaddr *)&#038;sin,sizeof(sin))==-1)<br \/>  {<br \/>    perror(&quot;Fail to bind&quot;);<br \/>    exit(1);<br \/>  }<\/p>\n<p>  flags=fcntl(sfd,F_GETFL);<br \/>  flags |= O_NONBLOCK;<\/p>\n<p>  if(fcntl(sfd,F_SETFL,flags)==-1)<br \/>  {<br \/>    perror(&quot;Fail to fcntl&quot;);<br \/>    exit(1);<br \/>  }<\/p>\n<p>  while(1)<br \/>  {<br \/>    sleep(5);<br \/>    bzero(buf,sizeof(buf));<br \/>    addr_len=sizeof(sin);<\/p>\n<p>    n=recvfrom(sfd,buf,MAX,0,(struct sockaddr *)&#038;cin,&#038;addr_len);<br \/>    if(n==-1&#038;&#038;errno!=EAGAIN)<br \/>    {<br \/>      perror(&quot;Fail to receiven&quot;);<br \/>      exit(1);<br \/>    }else if(errno==EAGAIN)<br \/>          printf(&quot;socket are not ready nown&quot;);<\/p>\n<p>    if(n&gt;=0)<br \/>    {    <br \/>      inet_ntop(AF_INET,&#038;cin.sin_addr,addr_p,sizeof(addr_p));<br \/>      printf(&quot;Client IP is %s:%dn&quot;,addr_p,ntohs(cin.sin_port));<br \/>      printf(&quot;type:%sn&quot;,buf);<br \/>      my_turn(buf);<\/p>\n<p>      n1=sendto(sfd,buf,n,0,(struct sockaddr *)&#038;cin,addr_len);<br \/>      if(n1==-1&#038;&#038;errno!=EAGAIN)<br \/>      {<br \/>        perror(&quot;Fail to sendto&quot;);exit(1);<br \/>      }else if(errno==EAGAIN)<br \/>            {<br \/>              printf(&quot;socket ate not ready nown&quot;);<br \/>            }<br \/>    }<\/p>\n<p>  }<br \/>  if(close(sfd)==-1)<br \/>  {<br \/>    perror(&quot;Fail to close&quot;);exit(1);<br \/>  }<br \/>  return 0;<br \/>}<\/p><\/blockquote>\n<p>\u5ba2\u6237\u7aef\uff1a<\/p>\n<blockquote><p>[ssj@main test]$ cat noneasyclient.c<br \/>#include &lt;stdio.h&gt;<br \/>#include &lt;string.h&gt;<br \/>#include &lt;unistd.h&gt;<br \/>#include &lt;ctype.h&gt;<br \/>#include &lt;sys\/socket.h&gt;<br \/>#include &lt;netinet\/in.h&gt;<br \/>#include &lt;arpa\/inet.h&gt;<br \/>#include &lt;stdlib.h&gt;<br \/>#include &lt;errno.h&gt;<br \/>#include &lt;unistd.h&gt;<\/p>\n<p>#define MAX 80<\/p>\n<p>int main(void)<br \/>{<br \/>  struct sockaddr_in sin,cin;<br \/>  int port=65533;<br \/>  socklen_t addr_len;<br \/>  int sfd;<br \/>  char buf[MAX];<br \/>  char add_p[INET_ADDRSTRLEN];<br \/>  int n;<\/p>\n<p>  bzero(&#038;sin,sizeof(sin));<br \/>  sin.sin_family=AF_INET;<br \/>  inet_pton(AF_INET,&quot;127.0.0.1&quot;,&#038;sin.sin_addr);<br \/>  sin.sin_port=htons(port);<\/p>\n<p>  sfd=socket(AF_INET,SOCK_DGRAM,0);<br \/>  if(sfd==-1){perror(&quot;Fail to socket&quot;);exit(1);}<\/p>\n<p>  if(fgets(buf,MAX,stdin)==NULL){perror(&quot;Fail to fget&quot;);exit(1);}<\/p>\n<p>  n=sendto(sfd,buf,strlen(buf)+1,0,(struct sockaddr *)&#038;sin,sizeof(sin));<br \/>  if(n==-1){perror(&quot;Fail to send&quot;);exit(1);}<\/p>\n<p>  addr_len=sizeof(sin);<\/p>\n<p>  n=recvfrom(sfd,buf,MAX,0,(struct sockaddr *)&#038;cin,&#038;addr_len);<br \/>    if(n==-1)<br \/>    {<br \/>      perror(&quot;Fail to receiven&quot;);<br \/>      exit(1);<br \/>    }else<br \/>      printf(&quot;from server:%sn&quot;,buf);<\/p>\n<p>  if(close(sfd)==-1)<br \/>  {<br \/>    perror(&quot;Fail to close&quot;);exit(1);<br \/>  }<br \/>  return 0;<\/p>\n<p>}<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>\u670d\u52a1\u5668\u7aef\uff1a [ssj@main test]$ cat noneasyserver.c#include &lt; [&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-143","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\/143","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=143"}],"version-history":[{"count":0,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=\/wp\/v2\/posts\/143\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.kumouse.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=143"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=143"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=143"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}