天天看点

linux下一个简单的基于IPv6(UDP)的回显服务器程序

 话不多说,直接上源码。

<code>/** </code>

<code> </code><code>*@author walker </code>

<code> </code><code>*@date 2012.9 </code>

<code> </code><code>*/</code> 

<code> </code> 

<code>#include &lt;unistd.h&gt; </code>

<code>#include &lt;arpa/inet.h&gt; </code>

<code>#include &lt;stdio.h&gt; </code>

<code>#include &lt;stdlib.h&gt; </code>

<code>#include &lt;string.h&gt; </code>

<code>#define UDP_PORT 6000   //预定义的端口号 </code>

<code>#define MAXSIZE 8192 </code>

<code>//实际使用端口号 </code>

<code>int</code> <code>g_udp_port = UDP_PORT; </code>

<code>//用于回显的函数 </code>

<code>void</code> <code>echo_fn(</code><code>int</code> <code>sockfd); </code>

<code>int</code> <code>main(</code><code>int</code> <code>argc, </code><code>char</code> <code>*argv[]) </code>

<code>{ </code>

<code>    </code><code>//获取用户输入的端口号 </code>

<code>    </code><code>if</code> <code>(argc &gt; 1) </code>

<code>    </code><code>{ </code>

<code>        </code><code>g_udp_port = </code><code>atoi</code><code>(argv[1]); </code>

<code>    </code><code>} </code>

<code>    </code><code>if</code> <code>(g_udp_port &lt;= 0 || g_udp_port &gt; 65535) </code>

<code>        </code><code>perror</code><code>(</code><code>"Invalid port.\n"</code><code>); </code>

<code>        </code><code>return</code> <code>-1; </code>

<code>    </code><code>int</code> <code>sockfd;     </code><code>//套接字描述符 </code>

<code>    </code><code>struct</code> <code>sockaddr_in6 addr;   </code><code>//用于UDP的IPv6地址结构 </code>

<code>    </code><code>if</code><code>((sockfd = socket(AF_INET6, SOCK_DGRAM,0)) == -1) </code>

<code>        </code><code>printf</code><code>(</code><code>"Error in socket\n"</code><code>); </code>

<code>    </code><code>bzero(&amp;addr, </code><code>sizeof</code><code>(addr)); </code>

<code>    </code><code>addr.sin6_family = AF_INET6; </code>

<code>    </code><code>addr.sin6_port = htons(g_udp_port); </code>

<code>    </code><code>addr.sin6_addr = in6addr_any; </code>

<code>    </code><code>if</code><code>(bind(sockfd, (</code><code>struct</code> <code>sockaddr *)&amp;addr, </code><code>sizeof</code><code>(</code><code>struct</code> <code>sockaddr_in6)) == -1) </code>

<code>        </code><code>printf</code><code>(</code><code>"Error in binding\n"</code><code>); </code>

<code>    </code><code>echo_fn(sockfd);    </code><code>//调用回显函数 </code>

<code>    </code><code>close(sockfd);      </code><code>//关闭套接字 </code>

<code>    </code><code>return</code> <code>-1; </code>

<code>} </code>

<code>void</code> <code>echo_fn(</code><code>int</code> <code>sockfd) </code>

<code>    </code><code>char</code> <code>data[MAXSIZE]; </code>

<code>    </code><code>int</code> <code>n = 0; </code>

<code>    </code><code>socklen_t len = </code><code>sizeof</code><code>(</code><code>struct</code> <code>sockaddr_in6); </code>

<code>    </code><code>struct</code> <code>sockaddr_in6 addr; </code>

<code>    </code><code>while</code><code>(1) </code>

<code>        </code><code>printf</code><code>(</code><code>"Waiting for data...\n"</code><code>); </code>

<code>        </code><code>//接受从客户端发来的数据 </code>

<code>        </code><code>if</code><code>((n = recvfrom(sockfd, data, MAXSIZE, 0, (</code><code>struct</code> <code>sockaddr *)&amp;addr, &amp;len)) == -1) </code>

<code>        </code><code>{ </code>

<code>            </code><code>printf</code><code>(</code><code>"Error in receiving\n"</code><code>); </code>

<code>            </code><code>exit</code><code>(-1); </code>

<code>        </code><code>} </code>

<code>        </code><code>data[n] = </code><code>'\0'</code><code>; </code>

<code>        </code><code>printf</code><code>(</code><code>"Received data: %s\n"</code><code>, data); </code>

<code>        </code><code>//将收到的数据再发送回去 </code>

<code>        </code><code>sendto(sockfd, data, n, 0, (</code><code>struct</code> <code>sockaddr *)&amp;addr, len); </code>

<code>        </code><code>//存储用"冒号十六进制记法"表示的IPv6地址 </code>

<code>        </code><code>char</code> <code>buf_addr[40]; </code>

<code>        </code><code>//将IPv6地址转为"冒号十六进制记法"(colon hexadecimal notation)表示 </code>

<code>        </code><code>inet_ntop(AF_INET6, &amp;addr.sin6_addr, buf_addr, 64); </code>

<code>        </code><code>printf</code><code>(</code><code>"Client ip: %s\n"</code><code>, buf_addr); </code>

<code>        </code><code>printf</code><code>(</code><code>"Client port: %d\n"</code><code>, ntohs(addr.sin6_port)); </code>

<code>        </code><code>printf</code><code>(</code><code>"\n"</code><code>); </code>

<code>}</code>

*** walker ***

本文转自walker snapshot博客51CTO博客,原文链接http://blog.51cto.com/walkerqt/1006583如需转载请自行联系原作者

RQSLT

继续阅读