話不多說,直接上源碼。
<code>/** </code>
<code> </code><code>*@author walker </code>
<code> </code><code>*@date 2012.9 </code>
<code> </code><code>*/</code>
<code> </code>
<code>#include <unistd.h> </code>
<code>#include <arpa/inet.h> </code>
<code>#include <stdio.h> </code>
<code>#include <stdlib.h> </code>
<code>#include <string.h> </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 > 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 <= 0 || g_udp_port > 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(&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 *)&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 *)&addr, &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 *)&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, &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