{"id":720,"date":"2018-03-15T16:07:12","date_gmt":"2018-03-15T08:07:12","guid":{"rendered":"http:\/\/www.max-shu.com\/blog\/?p=720"},"modified":"2018-03-15T16:07:12","modified_gmt":"2018-03-15T08:07:12","slug":"%e7%94%a8c-c%e8%af%ad%e8%a8%80%e5%9c%a8ipv6%e4%b8%8b%e7%9a%84socket%e9%80%9a%e4%bf%a1%e7%bc%96%e7%a8%8b","status":"publish","type":"post","link":"http:\/\/www.max-shu.com\/blog\/?p=720","title":{"rendered":"\u7528c\/c++\u8bed\u8a00\u5728IPv6\u4e0b\u7684socket\u901a\u4fe1\u7f16\u7a0b"},"content":{"rendered":"<div>\n<p>\u4e0b\u9762\u4e3aDaytime\u8fd9\u4e2a\u670d\u52a1\u7684\u6e90\u4ee3\u7801\u4f8b\u5b50\uff0c\u540c\u65f6\u517c\u5bb9IPV6\u548cIPV4\u7684\u5730\u5740\uff0c\u6700\u540e\u90e8\u5206\u6709\u66f4\u591a\u8bf4\u660e\u3002<\/p>\n<h2><b>\u5355\u64ad\u6a21\u5f0f\u4e0b\u7684Server\u65b9\u4ee3\u7801\uff1a<\/b><\/h2>\n<h3><b>&#8220;listen_server.h&#8221;\uff1a<\/b><\/h3>\n<p>#ifndef listen__server__h__<\/p>\n<p>#define listen__server__h__<\/p>\n<p>\/*<\/p>\n<p>listen_server<\/p>\n<p>creates a server server socket listening at a hostname:service<\/p>\n<p>using the family and socket type specified in the function<\/p>\n<p>arguments.<\/p>\n<p>*\/<\/p>\n<p>int<\/p>\n<p>listen_server(const char *hostname,<\/p>\n<p>const char *service,<\/p>\n<p>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0family,<\/p>\n<p>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0socktype);<\/p>\n<p>#endif<\/p>\n<h3><b>&#8220;listen_server.cpp&#8221;\uff1a<\/b><\/h3>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include &#8220;listen_server.h&#8221;<\/p>\n<p>const int LISTEN_QUEUE=128;<\/p>\n<p>int<\/p>\n<p>listen_server(const char *hostname,<\/p>\n<p>const char *service,<\/p>\n<p>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0family,<\/p>\n<p>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0socktype)<\/p>\n<p>{<\/p>\n<p>struct addrinfo hints, *res, *ressave;<\/p>\n<p>int n, sockfd;<\/p>\n<p>memset(&amp;hints, 0, sizeof(struct addrinfo));<\/p>\n<p>\/*<\/p>\n<p>AI_PASSIVE flag: the resulting address is used to bind<\/p>\n<p>to a socket for accepting incoming connections.<\/p>\n<p>So, when the hostname==NULL, getaddrinfo function will<\/p>\n<p>return one entry per allowed protocol family containing<\/p>\n<p>the unspecified address for that family.<\/p>\n<p>*\/<\/p>\n<p>hints.ai_flags\u00a0\u00a0\u00a0\u00a0= AI_PASSIVE;<\/p>\n<p>hints.ai_family\u00a0\u00a0\u00a0= family;<\/p>\n<p>hints.ai_socktype = socktype;<\/p>\n<p>n = getaddrinfo(hostname, service, &amp;hints, &amp;res);<\/p>\n<p>if (n &lt;0) {<\/p>\n<p>fprintf(stderr,<\/p>\n<p>&#8220;getaddrinfo error:: [%s]\\n&#8221;,<\/p>\n<p>gai_strerror(n));<\/p>\n<p>return -1;<\/p>\n<p>}<\/p>\n<p>ressave=res;<\/p>\n<p>\/*<\/p>\n<p>Try open socket with each address getaddrinfo returned,<\/p>\n<p>until getting a valid listening socket.<\/p>\n<p>*\/<\/p>\n<p>sockfd=-1;<\/p>\n<p>while (res) {<\/p>\n<p>sockfd = socket(res-&gt;ai_family,<\/p>\n<p>res-&gt;ai_socktype,<\/p>\n<p>res-&gt;ai_protocol);<\/p>\n<p>if (!(sockfd &lt; 0)) {<\/p>\n<p>if (bind(sockfd, res-&gt;ai_addr, res-&gt;ai_addrlen) == 0)<\/p>\n<p>break;<\/p>\n<p>close(sockfd);<\/p>\n<p>sockfd=-1;<\/p>\n<p>}<\/p>\n<p>res = res-&gt;ai_next;<\/p>\n<p>}<\/p>\n<p>if (sockfd &lt; 0) {<\/p>\n<p>freeaddrinfo(ressave);<\/p>\n<p>fprintf(stderr,<\/p>\n<p>&#8220;socket error:: could not open socket\\n&#8221;);<\/p>\n<p>return -1;<\/p>\n<p>}<\/p>\n<p>listen(sockfd, LISTEN_QUEUE);<\/p>\n<p>freeaddrinfo(ressave);<\/p>\n<p>return sockfd;<\/p>\n<p>}<\/p>\n<h3><b>TCP\u6a21\u5f0f &#8220;tcp_daytime_server.cpp&#8221;\uff1a<\/b><\/h3>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include &#8220;listen_server.h&#8221;<\/p>\n<p>const char *DAYTIME_PORT=&#8221;13&#8243;;<\/p>\n<p>int<\/p>\n<p>main(int argc, char *argv[])<\/p>\n<p>{<\/p>\n<p>int listenfd, connfd;<\/p>\n<p>socklen_t addrlen;<\/p>\n<p>char timeStr[256];<\/p>\n<p>struct sockaddr_storage clientaddr;<\/p>\n<p>time_t now;<\/p>\n<p>char clienthost[NI_MAXHOST];<\/p>\n<p>char clientservice[NI_MAXSERV];<\/p>\n<p>\/* local server socket listening at daytime port=13 *\/<\/p>\n<p>listenfd = listen_server( NULL, DAYTIME_PORT,<\/p>\n<p>AF_UNSPEC, SOCK_STREAM);<\/p>\n<p>if (listenfd &lt; 0) {<\/p>\n<p>fprintf(stderr,<\/p>\n<p>&#8220;listen_socket error:: could not create listening &#8221;<\/p>\n<p>&#8220;socket\\n&#8221;);<\/p>\n<p>return -1;<\/p>\n<p>}<\/p>\n<p>for ( ; \ud83d\ude09 {<\/p>\n<p>addrlen = sizeof(clientaddr);<\/p>\n<p>\/* accept daytime client connections *\/<\/p>\n<p>connfd = accept(listenfd,<\/p>\n<p>(struct sockaddr *)&amp;clientaddr,<\/p>\n<p>&amp;addrlen);<\/p>\n<p>if (connfd &lt; 0)<\/p>\n<p>continue;<\/p>\n<p>memset(clienthost, 0, sizeof(clienthost));<\/p>\n<p>memset(clientservice, 0, sizeof(clientservice));<\/p>\n<p>getnameinfo((struct sockaddr *)&amp;clientaddr, addrlen,<\/p>\n<p>clienthost, sizeof(clienthost),<\/p>\n<p>clientservice, sizeof(clientservice),<\/p>\n<p>NI_NUMERICHOST);<\/p>\n<p>printf(&#8220;Received request from host=[%s] port=[%s]\\n&#8221;,<\/p>\n<p>clienthost, clientservice);<\/p>\n<p>\/* process daytime request from a client *\/<\/p>\n<p>memset(timeStr, 0, sizeof(timeStr));<\/p>\n<p>time(&amp;now);<\/p>\n<p>sprintf(timeStr, &#8220;%s&#8221;, ctime(&amp;now));<\/p>\n<p>write(connfd, timeStr, strlen(timeStr));<\/p>\n<p>close(connfd);<\/p>\n<p>}<\/p>\n<p>return 0;<\/p>\n<p>}<\/p>\n<h3><b>UDP\u6a21\u5f0f &#8220;udp_daytime_server.cpp&#8221;\uff1a<\/b><\/h3>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include &#8220;listen_server.h&#8221;<\/p>\n<p>const char *DAYTIME_PORT=&#8221;13&#8243;;<\/p>\n<p>int<\/p>\n<p>main(int argc, char *argv[])<\/p>\n<p>{<\/p>\n<p>int listenfd, n;<\/p>\n<p>socklen_t addrlen;<\/p>\n<p>char *myhost;<\/p>\n<p>char timeStr[256];<\/p>\n<p>struct sockaddr_storage clientaddr;<\/p>\n<p>time_t now;<\/p>\n<p>char b[256];<\/p>\n<p>char clienthost[NI_MAXHOST];<\/p>\n<p>char clientservice[NI_MAXSERV];<\/p>\n<p>myhost=NULL;<\/p>\n<p>if (argc &gt; 1)<\/p>\n<p>myhost=argv[1];<\/p>\n<p>listenfd= listen_server(myhost, DAYTIME_PORT, AF_UNSPEC, SOCK_DGRAM);<\/p>\n<p>if (listenfd &lt; 0) {<\/p>\n<p>fprintf(stderr,<\/p>\n<p>&#8220;listen_server error:: could not create listening &#8221;<\/p>\n<p>&#8220;socket\\n&#8221;);<\/p>\n<p>return -1;<\/p>\n<p>}<\/p>\n<p>addrlen = sizeof(clientaddr);<\/p>\n<p>for ( ; \ud83d\ude09 {<\/p>\n<p>n = recvfrom(listenfd,<\/p>\n<p>b,<\/p>\n<p>sizeof(b),<\/p>\n<p>0,<\/p>\n<p>(struct sockaddr *)&amp;clientaddr,<\/p>\n<p>&amp;addrlen);<\/p>\n<p>if (n &lt; 0)<\/p>\n<p>continue;<\/p>\n<p>memset(clienthost, 0, sizeof(clienthost));<\/p>\n<p>memset(clientservice, 0, sizeof(clientservice));<\/p>\n<p>getnameinfo((struct sockaddr *)&amp;clientaddr, addrlen,<\/p>\n<p>clienthost, sizeof(clienthost),<\/p>\n<p>clientservice, sizeof(clientservice),<\/p>\n<p>NI_NUMERICHOST);<\/p>\n<p>printf(&#8220;Received request from host=[%s] port=[%s]\\n&#8221;,<\/p>\n<p>clienthost, clientservice);<\/p>\n<p>memset(timeStr, 0, sizeof(timeStr));<\/p>\n<p>time(&amp;now);<\/p>\n<p>sprintf(timeStr, &#8220;%s&#8221;, ctime(&amp;now));<\/p>\n<p>n = sendto(listenfd, timeStr, sizeof(timeStr), 0,<\/p>\n<p>(struct sockaddr *)&amp;clientaddr,<\/p>\n<p>addrlen);<\/p>\n<p>}<\/p>\n<p>return 0;<\/p>\n<p>}<\/p>\n<h2><b>\u5355\u64ad\u6a21\u5f0f\u4e0b\u7684Client\u65b9\u4ee3\u7801\uff1a<\/b><\/h2>\n<h3><b>&#8220;connect_client.h&#8221;\uff1a<\/b><\/h3>\n<p>#ifndef connect__client__h__<\/p>\n<p>#define connect__client__h__<\/p>\n<p>int<\/p>\n<p>connect_client (const char *hostname,<\/p>\n<p>const char *service,<\/p>\n<p>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0family,<\/p>\n<p>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0socktype);<\/p>\n<p>#endif<\/p>\n<h3><b>&#8220;connect_client.cpp&#8221;\uff1a<\/b><\/h3>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include &#8220;connect_client.h&#8221;<\/p>\n<p>int<\/p>\n<p>connect_client (const char *hostname,<\/p>\n<p>const char *service,<\/p>\n<p>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0family,<\/p>\n<p>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0socktype)<\/p>\n<p>{<\/p>\n<p>struct addrinfo hints, *res, *ressave;<\/p>\n<p>int n, sockfd;<\/p>\n<p>memset(&amp;hints, 0, sizeof(struct addrinfo));<\/p>\n<p>hints.ai_family = family;<\/p>\n<p>hints.ai_socktype = socktype;<\/p>\n<p>n = getaddrinfo(hostname, service, &amp;hints, &amp;res);<\/p>\n<p>if (n &lt;0) {<\/p>\n<p>fprintf(stderr,<\/p>\n<p>&#8220;getaddrinfo error:: [%s]\\n&#8221;,<\/p>\n<p>gai_strerror(n));<\/p>\n<p>return -1;<\/p>\n<p>}<\/p>\n<p>ressave = res;<\/p>\n<p>sockfd=-1;<\/p>\n<p>while (res) {<\/p>\n<p>sockfd = socket(res-&gt;ai_family,<\/p>\n<p>res-&gt;ai_socktype,<\/p>\n<p>res-&gt;ai_protocol);<\/p>\n<p>if (!(sockfd &lt; 0)) {<\/p>\n<p>if (connect(sockfd, res-&gt;ai_addr, res-&gt;ai_addrlen) == 0)<\/p>\n<p>break;<\/p>\n<p>close(sockfd);<\/p>\n<p>sockfd=-1;<\/p>\n<p>}<\/p>\n<p>res=res-&gt;ai_next;<\/p>\n<p>}<\/p>\n<p>freeaddrinfo(ressave);<\/p>\n<p>return sockfd;<\/p>\n<p>}<\/p>\n<h3><b>TCP\u6a21\u5f0f &#8220;tcp_daytime_client.cpp&#8221;\uff1a<\/b><\/h3>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include &#8220;connect_client.h&#8221;<\/p>\n<p>const char *DAYTIME_PORT=&#8221;13&#8243;;<\/p>\n<p>int<\/p>\n<p>main(int argc, char *argv[])<\/p>\n<p>{<\/p>\n<p>int connfd;<\/p>\n<p>char *myhost;<\/p>\n<p>char timeStr[256];<\/p>\n<p>myhost = &#8220;localhost&#8221;;<\/p>\n<p>if (argc &gt; 1)<\/p>\n<p>myhost = argv[1];<\/p>\n<p>connfd= connect_client(myhost, DAYTIME_PORT, AF_UNSPEC, SOCK_STREAM);<\/p>\n<p>if (connfd &lt; 0) {<\/p>\n<p>fprintf(stderr,<\/p>\n<p>&#8220;client error:: could not create connected socket &#8221;<\/p>\n<p>&#8220;socket\\n&#8221;);<\/p>\n<p>return -1;<\/p>\n<p>}<\/p>\n<p>memset(timeStr, 0, sizeof(timeStr));<\/p>\n<p>while (read(connfd, timeStr, sizeof(timeStr)) &gt; 0)<\/p>\n<p>printf(&#8220;%s&#8221;, timeStr);<\/p>\n<p>close(connfd);<\/p>\n<p>return 0;<\/p>\n<p>}<\/p>\n<h3><b>UDP\u6a21\u5f0f &#8220;udp_daytime_client.cpp&#8221;\uff1a<\/b><\/h3>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include &#8220;connect_client.h&#8221;<\/p>\n<p>const char *DAYTIME_PORT=&#8221;13&#8243;;<\/p>\n<p>int<\/p>\n<p>main(int argc, char *argv[])<\/p>\n<p>{<\/p>\n<p>int connfd, n, m;<\/p>\n<p>char *myhost;<\/p>\n<p>char timeStr[256];<\/p>\n<p>char letter;<\/p>\n<p>myhost = &#8220;localhost&#8221;;<\/p>\n<p>if (argc &gt; 1)<\/p>\n<p>myhost=argv[1];<\/p>\n<p>connfd = connect_client(myhost, DAYTIME_PORT, AF_UNSPEC, SOCK_DGRAM);<\/p>\n<p>if (connfd &lt; 0) {<\/p>\n<p>fprintf(stderr,<\/p>\n<p>&#8220;client error:: could not create connected socket &#8221;<\/p>\n<p>&#8220;socket\\n&#8221;);<\/p>\n<p>return -1;<\/p>\n<p>}<\/p>\n<p>letter = &#8216;1&#8217;;<\/p>\n<p>m= write(connfd, &amp;letter, sizeof(letter));<\/p>\n<p>memset(timeStr, 0, sizeof(timeStr));<\/p>\n<p>n = read(connfd,<\/p>\n<p>timeStr,<\/p>\n<p>sizeof(timeStr));<\/p>\n<p>printf(&#8220;%s\\n&#8221;, timeStr);<\/p>\n<p>close(connfd);<\/p>\n<p>return 0;<\/p>\n<p>}<\/p>\n<h2><b>\u591a\u64ad\u6a21\u5f0f\u4e0b\u7684\u4ee3\u7801\uff1a<\/b><\/h2>\n<h3><b>\u670d\u52a1\u7aef\u548c\u5ba2\u6237\u7aef\u5171\u7528 &#8220;mcastutil.cpp&#8221;\uff1a<\/b><\/h3>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include &#8220;mcastutil.h&#8221;<\/p>\n<p>int<\/p>\n<p>get_addr (const char *hostname,<\/p>\n<p>const char *service,<\/p>\n<p>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0family,<\/p>\n<p>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0socktype,<\/p>\n<p>struct sockaddr_storage *addr)<\/p>\n<p>{<\/p>\n<p>struct addrinfo hints, *res, *ressave;<\/p>\n<p>int n, sockfd, retval;<\/p>\n<p>retval = -1;<\/p>\n<p>memset(&amp;hints, 0, sizeof(struct addrinfo));<\/p>\n<p>hints.ai_family = family;<\/p>\n<p>hints.ai_socktype = socktype;<\/p>\n<p>n = getaddrinfo(hostname, service, &amp;hints, &amp;res);<\/p>\n<p>if (n &lt;0) {<\/p>\n<p>fprintf(stderr,<\/p>\n<p>&#8220;getaddrinfo error:: [%s]\\n&#8221;,<\/p>\n<p>gai_strerror(n));<\/p>\n<p>return retval;<\/p>\n<p>}<\/p>\n<p>ressave = res;<\/p>\n<p>sockfd=-1;<\/p>\n<p>while (res) {<\/p>\n<p>sockfd = socket(res-&gt;ai_family,<\/p>\n<p>res-&gt;ai_socktype,<\/p>\n<p>res-&gt;ai_protocol);<\/p>\n<p>if (!(sockfd &lt; 0)) {<\/p>\n<p>if (bind(sockfd, res-&gt;ai_addr, res-&gt;ai_addrlen) == 0) {<\/p>\n<p>close(sockfd);<\/p>\n<p>memcpy(addr, res-&gt;ai_addr, sizeof(*addr);<\/p>\n<p>retval=0;<\/p>\n<p>break;<\/p>\n<p>}<\/p>\n<p>close(sockfd);<\/p>\n<p>sockfd=-1;<\/p>\n<p>}<\/p>\n<p>res=res-&gt;ai_next;<\/p>\n<p>}<\/p>\n<p>freeaddrinfo(ressave);<\/p>\n<p>return retval;<\/p>\n<p>}<\/p>\n<p>int<\/p>\n<p>joinGroup(int sockfd, int loopBack, int mcastTTL,<\/p>\n<p>struct sockaddr_storage *addr)<\/p>\n<p>{<\/p>\n<p>int r1, r2, r3, retval;<\/p>\n<p>retval=-1;<\/p>\n<p>switch (addr-&gt;ss_family) {<\/p>\n<p>case AF_INET: {<\/p>\n<p>struct ip_mreq\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mreq;<\/p>\n<p>mreq.imr_multiaddr.s_addr=<\/p>\n<p>((struct sockaddr_in *)addr)-&gt;sin_addr.s_addr;<\/p>\n<p>mreq.imr_interface.s_addr= INADDR_ANY;<\/p>\n<p>r1= setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_LOOP,<\/p>\n<p>&amp;loopBack, sizeof(loopBack));<\/p>\n<p>if (r1&lt;0)<\/p>\n<p>perror(&#8220;joinGroup:: IP_MULTICAST_LOOP:: &#8220;);<\/p>\n<p>r2= setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL,<\/p>\n<p>&amp;mcastTTL, sizeof(mcastTTL));<\/p>\n<p>if (r2&lt;0)<\/p>\n<p>perror(&#8220;joinGroup:: IP_MULTICAST_TTL:: &#8220;);<\/p>\n<p>r3= setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,<\/p>\n<p>(const void *)&amp;mreq, sizeof(mreq));<\/p>\n<p>if (r3&lt;0)<\/p>\n<p>perror(&#8220;joinGroup:: IP_ADD_MEMBERSHIP:: &#8220;);<\/p>\n<p>} break;<\/p>\n<p>case AF_INET6: {<\/p>\n<p>struct ipv6_mreq\u00a0\u00a0\u00a0\u00a0mreq6;<\/p>\n<p>memcpy(&amp;mreq6.ipv6mr_multiaddr,<\/p>\n<p>&amp;(((struct sockaddr_in6 *)addr)-&gt;sin6_addr),<\/p>\n<p>sizeof(struct in6_addr));<\/p>\n<p>mreq6.ipv6mr_interface= 0; \/\/ cualquier interfaz<\/p>\n<p>r1= setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,<\/p>\n<p>&amp;loopBack, sizeof(loopBack));<\/p>\n<p>if (r1&lt;0)<\/p>\n<p>perror(&#8220;joinGroup:: IPV6_MULTICAST_LOOP:: &#8220;);<\/p>\n<p>r2= setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,<\/p>\n<p>&amp;mcastTTL, sizeof(mcastTTL));<\/p>\n<p>if (r2&lt;0)<\/p>\n<p>perror(&#8220;joinGroup:: IPV6_MULTICAST_HOPS::\u00a0\u00a0&#8220;);<\/p>\n<p>r3= setsockopt(sockfd, IPPROTO_IPV6,<\/p>\n<p>IPV6_ADD_MEMBERSHIP, &amp;mreq6, sizeof(mreq6));<\/p>\n<p>if (r3&lt;0)<\/p>\n<p>perror(&#8220;joinGroup:: IPV6_ADD_MEMBERSHIP:: &#8220;);<\/p>\n<p>} break;<\/p>\n<p>default:<\/p>\n<p>r1=r2=r3=-1;<\/p>\n<p>}<\/p>\n<p>if ((r1&gt;=0) &amp;&amp; (r2&gt;=0) &amp;&amp; (r3&gt;=0))<\/p>\n<p>retval=0;<\/p>\n<p>return retval;<\/p>\n<p>}<\/p>\n<p>int<\/p>\n<p>isMulticast(struct sockaddr_storage *addr)<\/p>\n<p>{<\/p>\n<p>int retVal;<\/p>\n<p>retVal=-1;<\/p>\n<p>switch (addr-&gt;ss_family) {<\/p>\n<p>case AF_INET: {<\/p>\n<p>struct sockaddr_in *addr4=(struct sockaddr_in *)addr;<\/p>\n<p>retVal = IN_MULTICAST(ntohl(addr4-&gt;sin_addr.s_addr));<\/p>\n<p>} break;<\/p>\n<p>case AF_INET6: {<\/p>\n<p>struct sockaddr_in6 *addr6=(struct sockaddr_in6 *)addr;<\/p>\n<p>retVal = IN6_IS_ADDR_MULTICAST(&amp;addr6-&gt;sin6_addr);<\/p>\n<p>} break;<\/p>\n<p>default:<\/p>\n<p>;<\/p>\n<p>}<\/p>\n<p>return retVal;<\/p>\n<p>}<\/p>\n<h3><b>\u670d\u52a1\u7aef &#8220;mcastserver.cpp&#8221;\uff1a<\/b><\/h3>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include &#8220;mcastutil.h&#8221;<\/p>\n<p>const char *DAYTIME_PORT=&#8221;13&#8243;;<\/p>\n<p>int<\/p>\n<p>main(int argc, char *argv[])<\/p>\n<p>{<\/p>\n<p>int sockfd, n;<\/p>\n<p>char *mcastaddr;<\/p>\n<p>char timeStr[256];<\/p>\n<p>char b[256];<\/p>\n<p>struct sockaddr_storage clientaddr, addr;<\/p>\n<p>socklen_t addrlen;<\/p>\n<p>time_t now;<\/p>\n<p>char clienthost[NI_MAXHOST];<\/p>\n<p>char clientservice[NI_MAXSERV];<\/p>\n<p>mcastaddr = &#8220;FF01::1111&#8221;;<\/p>\n<p>if (argc ==2)<\/p>\n<p>mcastaddr=argv[1];<\/p>\n<p>memset(&amp;addr, 0, sizeof(addr));<\/p>\n<p>if (get_addr(mcastaddr, DAYTIME_PORT, PF_UNSPEC,<\/p>\n<p>SOCK_DGRAM, &amp;addr) &lt;0)<\/p>\n<p>{<\/p>\n<p>fprintf(stderr, &#8220;get_addr error:: could not find multicast &#8221;<\/p>\n<p>&#8220;address=[%s] port=[%s]\\n&#8221;, mcastaddr, DAYTIME_PORT);<\/p>\n<p>return -1;<\/p>\n<p>}<\/p>\n<p>if (isMulticast(&amp;addr)&lt;0) {<\/p>\n<p>fprintf(stderr,<\/p>\n<p>&#8220;This address does not seem a multicast address [%s]\\n&#8221;,<\/p>\n<p>mcastaddr);<\/p>\n<p>return -1;<\/p>\n<p>}<\/p>\n<p>sockfd = socket(addr.ss_family, SOCK_DGRAM, 0);<\/p>\n<p>if (bind(sockfd, (struct sockaddr *)&amp;addr, sizeof(addr)) &lt; 0) {<\/p>\n<p>perror(&#8220;bind error:: &#8220;);<\/p>\n<p>close(sockfd);<\/p>\n<p>return -1;<\/p>\n<p>}<\/p>\n<p>if (joinGroup(sockfd, 0 , 8, &amp;addr) &lt;0) {<\/p>\n<p>close(sockfd);<\/p>\n<p>return -1;<\/p>\n<p>}<\/p>\n<p>addrlen=sizeof(clientaddr);<\/p>\n<p>for ( ; \ud83d\ude09 {<\/p>\n<p>n = recvfrom(sockfd,<\/p>\n<p>b,<\/p>\n<p>sizeof(b),<\/p>\n<p>0,<\/p>\n<p>(struct sockaddr *)&amp;clientaddr,<\/p>\n<p>&amp;addrlen);<\/p>\n<p>if (n &lt;0)<\/p>\n<p>continue;<\/p>\n<p>memset(clienthost, 0, sizeof(clienthost));<\/p>\n<p>memset(clientservice, 0, sizeof(clientservice));<\/p>\n<p>getnameinfo((struct sockaddr *)&amp;clientaddr, addrlen,<\/p>\n<p>clienthost, sizeof(clienthost),<\/p>\n<p>clientservice, sizeof(clientservice),<\/p>\n<p>NI_NUMERICHOST);<\/p>\n<p>printf(&#8220;Received request from host=[%s] port=[%s]\\n&#8221;,<\/p>\n<p>clienthost, clientservice);<\/p>\n<p>memset(timeStr, 0, sizeof(timeStr));<\/p>\n<p>time(&amp;now);<\/p>\n<p>sprintf(timeStr, &#8220;%s&#8221;, ctime(&amp;now));<\/p>\n<p>n = sendto(sockfd, timeStr, sizeof(timeStr), 0,<\/p>\n<p>(struct sockaddr *)&amp;addr,<\/p>\n<p>sizeof(addr));<\/p>\n<p>if (n&lt;1)<\/p>\n<p>perror(&#8220;sendto error:: \\n&#8221;);<\/p>\n<p>}<\/p>\n<p>return 0;<\/p>\n<p>}<\/p>\n<h3><b>\u5ba2\u6237\u7aef &#8220;mcastclient.cpp&#8221;\uff1a<\/b><\/h3>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include &#8220;mcastutil.h&#8221;<\/p>\n<p>const char *DAYTIME_PORT=&#8221;13&#8243;;<\/p>\n<p>int<\/p>\n<p>main(int argc, char *argv[])<\/p>\n<p>{<\/p>\n<p>int sockfd, n;<\/p>\n<p>char *myhost;<\/p>\n<p>char timeStr[256];<\/p>\n<p>char letter;<\/p>\n<p>struct sockaddr_storage addr, clientaddr;<\/p>\n<p>int addrlen;<\/p>\n<p>socklen_t clientaddrlen;<\/p>\n<p>myhost = &#8220;FF01::1111&#8221;;<\/p>\n<p>if (argc == 2)<\/p>\n<p>myhost=argv[1];<\/p>\n<p>addrlen=sizeof(addr);<\/p>\n<p>memset(&amp;addr, 0, addrlen);<\/p>\n<p>get_addr(myhost, DAYTIME_PORT, PF_UNSPEC, SOCK_DGRAM, &amp;addr);<\/p>\n<p>sockfd = socket(addr.ss_family, SOCK_DGRAM, 0);<\/p>\n<p>if (bind(sockfd, (struct sockaddr *)&amp;addr, addrlen) &lt;0) {<\/p>\n<p>perror(&#8220;bind error:: \\n&#8221;);<\/p>\n<p>close(sockfd);<\/p>\n<p>return -1;<\/p>\n<p>}<\/p>\n<p>if (joinGroup(sockfd, 0 , 8, &amp;addr) &lt;0) {<\/p>\n<p>close(sockfd);<\/p>\n<p>return -1;<\/p>\n<p>}<\/p>\n<p>letter = &#8216;1&#8217;;<\/p>\n<p>n = sendto(sockfd, &amp;letter, sizeof(letter), 0,<\/p>\n<p>(struct sockaddr *)&amp;addr,<\/p>\n<p>addrlen);<\/p>\n<p>if (n&lt;0) {<\/p>\n<p>perror(&#8220;sendto error:: &#8220;);<\/p>\n<p>close(sockfd);<\/p>\n<p>return -1;<\/p>\n<p>}<\/p>\n<p>memset(timeStr, 0, sizeof(timeStr));<\/p>\n<p>clientaddrlen=sizeof(clientaddr);<\/p>\n<p>n = recvfrom(sockfd,<\/p>\n<p>timeStr,<\/p>\n<p>sizeof(timeStr),<\/p>\n<p>0,<\/p>\n<p>(struct sockaddr *)&amp;clientaddr,<\/p>\n<p>&amp;clientaddrlen);<\/p>\n<p>if (n&lt;0) {<\/p>\n<p>perror(&#8220;sendto error:: &#8220;);<\/p>\n<p>close(sockfd);<\/p>\n<p>return -1;<\/p>\n<p>}<\/p>\n<p>printf(&#8220;%s\\n&#8221;, timeStr);<\/p>\n<p>close(sockfd);<\/p>\n<p>return 0;<\/p>\n<p>}<\/p>\n<h2><b>\u4e0d\u4f7f\u7528\u4e3b\u673a\u540d\u6216DNS\u89e3\u6790\u65f6\u600e\u4e48\u64cd\u4f5c<\/b><\/h2>\n<p>\u4e0a\u9762\u4f8b\u5b50\u4e2d\u90fd\u662f\u7528\u7684\u4e3b\u673a\u540d\u6216\u8005dns\u89e3\u6790\u6765\u5f97\u5230\u5177\u4f53\u5730\u5740\u7684\uff0c\u4ecehosts\u6587\u4ef6\u6216\u8005dns\u89e3\u6790\u901a\u8fc7gethostbyname\u80fd\u5f97\u5230\u5177\u4f53\u7684IPV6\u6216IPV4\u5730\u5740\uff0c\u5982\u4e0b\u56fe\u793a\uff1a<\/p>\n<div class=\"image-package\">\n<div class=\"image-container\">\n<div class=\"image-container-fill\">\u00a0<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-721\" src=\"http:\/\/www.max-shu.com\/blog\/wp-content\/uploads\/2018\/03\/7412056-a9080548561bce55.png\" alt=\"\" width=\"575\" height=\"431\" \/><\/div>\n<\/div>\n<div class=\"image-caption\"><\/div>\n<\/div>\n<h3><b>\u5185\u6838\u652f\u6301\u53cc\u6808\u534f\u8bae\uff1a<\/b><\/h3>\n<p>\u5982\u679c\u8981\u76f4\u63a5\u4f7f\u7528IPV6\u5730\u5740\u6216IPV4\u5730\u5740\uff0c<b>\u5982\u679c\u5185\u6838\u652f\u6301\u53cc\u6808\u534f\u8bae\uff08\u89c1\u4e0b\u56fe\uff09\uff0c\u5219\u53ea\u9700\u8981\u5b9e\u73b0\u6210ipv6\u5730\u5740\u64cd\u4f5c\u5373\u53ef\uff0c\u5e95\u5c42\u5185\u6838\u4f1a\u81ea\u52a8\u8fdb\u884cipv6\u548cipv4\u5730\u5740\u7684\u8f6c\u6362<\/b>\uff1a<\/p>\n<div class=\"image-package\">\n<div class=\"image-container\">\n<div class=\"image-container-fill\">\u00a0<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-722\" src=\"http:\/\/www.max-shu.com\/blog\/wp-content\/uploads\/2018\/03\/7412056-f10f68da313dd1e8.png\" alt=\"\" width=\"700\" height=\"530\" \/><\/div>\n<\/div>\n<div class=\"image-caption\"><\/div>\n<\/div>\n<div class=\"image-package\">\n<div class=\"image-container\">\n<div class=\"image-container-fill\"><\/div>\n<div class=\"image-view\" data-width=\"575\" data-height=\"431\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-723\" src=\"http:\/\/www.max-shu.com\/blog\/wp-content\/uploads\/2018\/03\/7412056-331c87aa4771207d.png\" alt=\"\" width=\"575\" height=\"431\" \/><\/div>\n<\/div>\n<div class=\"image-caption\"><\/div>\n<\/div>\n<div class=\"image-package\">\n<div class=\"image-container\">\n<div class=\"image-container-fill\">\u00a0<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-724\" src=\"http:\/\/www.max-shu.com\/blog\/wp-content\/uploads\/2018\/03\/7412056-b1ae0f6426af0990.png\" alt=\"\" width=\"575\" height=\"431\" \/><\/div>\n<\/div>\n<div class=\"image-caption\"><\/div>\n<\/div>\n<h3>\u00a0\u00a0\u00a0\u00a0<b>\u5ba2\u6237\u7aef\u4ee3\u7801IPv6\u4ee3\u7801\uff08\u5982\u679c\u4f7f\u7528ipv4\u65b9\u5f0f\uff0c\u5219\u4f7f\u7528\u4ee3\u7801\u4e2d\u7684\u6ce8\u91caIPv4\u7684\u4ee3\u7801\uff0c\u540c\u65f6\u6ce8\u91ca\u6389IPv6\u7684\u4ee3\u7801\uff1b\u53e6\u4e00\u79cd\u65b9\u5f0f\u8fd8\u662f\u7528ipv6\u4ee3\u7801\uff0c\u4f46\u662f\u670d\u52a1\u5668\u7aef\u7684\u5730\u5740\u4f7f\u7528::ffff:a.b.c.d\u65b9\u5f0f\u53bb\u8fdb\u884c\u8fde\u63a5\uff09\uff1a<\/b><\/h3>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#define MAXBUF 1024<\/p>\n<p>int main(int argc, char **argv)<\/p>\n<p>{<\/p>\n<p>int sockfd, len;<\/p>\n<p>\/* struct sockaddr_in dest; *\/\/\/ <b>IPv4<\/b><\/p>\n<p>struct sockaddr_in6 dest;\/\/<b> IPv6<\/b><\/p>\n<p>char buffer[MAXBUF + 1];<\/p>\n<p>if (argc != 3) {<\/p>\n<p>printf<\/p>\n<p>(&#8220;\u53c2\u6570\u683c\u5f0f\u9519\u8bef\uff01\u6b63\u786e\u7528\u6cd5\u5982\u4e0b\uff1a\/n\/t\/t%s IP\u5730\u5740 \u7aef\u53e3\/n\/t\u6bd4\u5982:\/t%s 127.0.0.1 80\/n\u6b64\u7a0b\u5e8f\u7528\u6765\u4ece\u67d0\u4e2a IP \u5730\u5740\u7684\u670d\u52a1\u5668\u67d0\u4e2a\u7aef\u53e3\u63a5\u6536\u6700\u591a MAXBUF \u4e2a\u5b57\u8282\u7684\u6d88\u606f&#8221;,<\/p>\n<p>argv[0], argv[0]);<\/p>\n<p>exit(0);<\/p>\n<p>}<\/p>\n<p>\/* \u521b\u5efa\u4e00\u4e2a socket \u7528\u4e8e tcp \u901a\u4fe1 *\/<\/p>\n<p>\/* if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) &lt; 0) { *\/ \/\/ IPv4<\/p>\n<p>if ((sockfd = socket(AF_INET6, SOCK_STREAM, 0)) &lt; 0) {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ IPv6<\/p>\n<p>perror(&#8220;Socket&#8221;);<\/p>\n<p>exit(errno);<\/p>\n<p>}<\/p>\n<p>printf(&#8220;socket created\/n&#8221;);<\/p>\n<p>\/* \u521d\u59cb\u5316\u670d\u52a1\u5668\u7aef\uff08\u5bf9\u65b9\uff09\u7684\u5730\u5740\u548c\u7aef\u53e3\u4fe1\u606f *\/<\/p>\n<p>bzero(&amp;dest, sizeof(dest));<\/p>\n<p>\/* dest.sin_family = AF_INET; *\/\u00a0\u00a0\/\/ IPv4<\/p>\n<p>dest.sin6_family = AF_INET6;\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ IPv6<\/p>\n<p>\/* dest.sin_port = htons(atoi(argv[2])); *\/ \/\/ IPv4<\/p>\n<p>dest.sin6_port = htons(atoi(argv[2]));\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ IPv6<\/p>\n<p>\/* if (inet_aton(argv[1], (struct in_addr *) &amp;dest.sin_addr.s_addr) == 0) { *\/ \/\/ IPv4 \u00a0\uff0c<b>argv[1]: 211.43.56.5<\/b><\/p>\n<p>if ( inet_pton(AF_INET6, argv[1], &amp;dest.sin6_addr) &lt; 0 ) {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ IPv6 \u00a0,<b>argv[1]: 2001:f653:98d3::1<\/b><\/p>\n<p>perror(argv[1]);<\/p>\n<p>exit(errno);<\/p>\n<p>}<\/p>\n<p>printf(&#8220;address created\/n&#8221;);<\/p>\n<p>\/* \u8fde\u63a5\u670d\u52a1\u5668 *\/<\/p>\n<p>if (connect(sockfd, (struct sockaddr *) &amp;dest, sizeof(dest)) != 0) {<\/p>\n<p>perror(&#8220;Connect &#8220;);<\/p>\n<p>exit(errno);<\/p>\n<p>}<\/p>\n<p>printf(&#8220;server connected\/n&#8221;);<\/p>\n<p>\/* \u63a5\u6536\u5bf9\u65b9\u53d1\u8fc7\u6765\u7684\u6d88\u606f\uff0c\u6700\u591a\u63a5\u6536 MAXBUF \u4e2a\u5b57\u8282 *\/<\/p>\n<p>bzero(buffer, MAXBUF + 1);<\/p>\n<p>\/* \u63a5\u6536\u670d\u52a1\u5668\u6765\u7684\u6d88\u606f *\/<\/p>\n<p>len = recv(sockfd, buffer, MAXBUF, 0);<\/p>\n<p>if (len &gt; 0)<\/p>\n<p>printf(&#8220;\u63a5\u6536\u6d88\u606f\u6210\u529f:&#8217;%s&#8217;\uff0c\u5171%d\u4e2a\u5b57\u8282\u7684\u6570\u636e\/n&#8221;,<\/p>\n<p>buffer, len);<\/p>\n<p>else<\/p>\n<p>printf<\/p>\n<p>(&#8220;\u6d88\u606f\u63a5\u6536\u5931\u8d25\uff01\u9519\u8bef\u4ee3\u7801\u662f%d\uff0c\u9519\u8bef\u4fe1\u606f\u662f&#8217;%s&#8217;\/n&#8221;,<\/p>\n<p>errno, strerror(errno));<\/p>\n<p>bzero(buffer, MAXBUF + 1);<\/p>\n<p>strcpy(buffer, &#8220;\u8fd9\u662f\u5ba2\u6237\u7aef\u53d1\u7ed9\u670d\u52a1\u5668\u7aef\u7684\u6d88\u606f\/n&#8221;);<\/p>\n<p>\/* \u53d1\u6d88\u606f\u7ed9\u670d\u52a1\u5668 *\/<\/p>\n<p>len = send(sockfd, buffer, strlen(buffer), 0);<\/p>\n<p>if (len &lt; 0)<\/p>\n<p>printf<\/p>\n<p>(&#8220;\u6d88\u606f&#8217;%s&#8217;\u53d1\u9001\u5931\u8d25\uff01\u9519\u8bef\u4ee3\u7801\u662f%d\uff0c\u9519\u8bef\u4fe1\u606f\u662f&#8217;%s&#8217;\/n&#8221;,<\/p>\n<p>buffer, errno, strerror(errno));<\/p>\n<p>else<\/p>\n<p>printf(&#8220;\u6d88\u606f&#8217;%s&#8217;\u53d1\u9001\u6210\u529f\uff0c\u5171\u53d1\u9001\u4e86%d\u4e2a\u5b57\u8282\uff01\/n&#8221;,<\/p>\n<p>buffer, len);<\/p>\n<p>\/* \u5173\u95ed\u8fde\u63a5 *\/<\/p>\n<p>close(sockfd);<\/p>\n<p>return 0;<\/p>\n<p>}<\/p>\n<h3><b>\u670d\u52a1\u5668\u7aef\u4ee3\u7801\uff08\u540c\u65f6\u652f\u6301IPv4\u548cIPv6\u7684\u5ba2\u6237\u7aef\u6765\u8fde\u63a5\uff09\uff1a<\/b><\/h3>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#include<\/p>\n<p>#define MAXBUF 1024<\/p>\n<p>int main(int argc, char **argv)<\/p>\n<p>{<\/p>\n<p>int sockfd, new_fd;<\/p>\n<p>socklen_t len;<\/p>\n<p>\/* struct sockaddr_in my_addr, their_addr; *\/ \/\/ IPv4<\/p>\n<p>struct sockaddr_in6 my_addr, their_addr; \/\/ IPv6<\/p>\n<p>unsigned int myport, lisnum;<\/p>\n<p>char buf[MAXBUF + 1];<\/p>\n<p>if (argv[1])<\/p>\n<p>myport = atoi(argv[1]);<\/p>\n<p>else<\/p>\n<p>myport = 7838;<\/p>\n<p>if (argv[2])<\/p>\n<p>lisnum = atoi(argv[2]);<\/p>\n<p>else<\/p>\n<p>lisnum = 2;<\/p>\n<p>\/* if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) { *\/ \/\/ IPv4<\/p>\n<p>if ((sockfd = socket(PF_INET6, SOCK_STREAM, 0)) == -1) { \/\/ IPv6<\/p>\n<p>perror(&#8220;socket&#8221;);<\/p>\n<p>exit(1);<\/p>\n<p>} else<\/p>\n<p>printf(&#8220;socket created\/n&#8221;);<\/p>\n<p>bzero(&amp;my_addr, sizeof(my_addr));<\/p>\n<p>\/* my_addr.sin_family = PF_INET; *\/ \/\/ IPv4<\/p>\n<p>my_addr.sin6_family = PF_INET6;\u00a0\u00a0\u00a0\u00a0\/\/ IPv6<\/p>\n<p>\/* my_addr.sin_port = htons(myport); *\/ \/\/ IPv4<\/p>\n<p>my_addr.sin6_port = htons(myport);\u00a0\u00a0\u00a0\/\/ IPv6<\/p>\n<p>if (argv[3])<\/p>\n<p>\/* my_addr.sin_addr.s_addr = inet_addr(argv[3]); *\/ \/\/ IPv4<\/p>\n<p>inet_pton(AF_INET6, argv[3], &amp;my_addr.sin6_addr);\u00a0\u00a0\/\/ IPv6<\/p>\n<p>else<\/p>\n<p>\/* my_addr.sin_addr.s_addr = INADDR_ANY; *\/ \/\/ IPv4 \u00a0,<b>use 0.0.0.0<\/b><\/p>\n<p>my_addr.sin6_addr = in6addr_any;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ IPv6 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ,<b>use ::<\/b><\/p>\n<p>\/* if (bind(sockfd, (struct sockaddr *) &amp;my_addr, sizeof(struct sockaddr)) *\/ \/\/ IPv4<\/p>\n<p>if (bind(sockfd, (struct sockaddr *) &amp;my_addr, sizeof(struct sockaddr_in6))\u00a0\u00a0\/\/ IPv6<\/p>\n<p>== -1) {<\/p>\n<p>perror(&#8220;bind&#8221;);<\/p>\n<p>exit(1);<\/p>\n<p>} else<\/p>\n<p>printf(&#8220;binded\/n&#8221;);<\/p>\n<p>if (listen(sockfd, lisnum) == -1) {<\/p>\n<p>perror(&#8220;listen&#8221;);<\/p>\n<p>exit(1);<\/p>\n<p>} else<\/p>\n<p>printf(&#8220;begin listen\/n&#8221;);<\/p>\n<p>while (1) {<\/p>\n<p>len = sizeof(struct sockaddr);<\/p>\n<p>if ((new_fd =<\/p>\n<p>accept(sockfd, (struct sockaddr *) &amp;their_addr,<\/p>\n<p>&amp;len)) == -1) {<\/p>\n<p>perror(&#8220;accept&#8221;);<\/p>\n<p>exit(errno);<\/p>\n<p>} else<\/p>\n<p>printf(&#8220;server: got connection from %s, port %d, socket %d\/n&#8221;,<\/p>\n<p>\/* inet_ntoa(their_addr.sin_addr), *\/ \/\/ IPv4<\/p>\n<p>inet_ntop(AF_INET6, &amp;their_addr.sin6_addr, buf, sizeof(buf)), \/\/ IPv6<\/p>\n<p>\/* ntohs(their_addr.sin_port), new_fd); *\/ \/\/ IPv4<\/p>\n<p>their_addr.sin6_port, new_fd); \/\/ IPv6<\/p>\n<p>\/* \u5f00\u59cb\u5904\u7406\u6bcf\u4e2a\u65b0\u8fde\u63a5\u4e0a\u7684\u6570\u636e\u6536\u53d1 *\/<\/p>\n<p>bzero(buf, MAXBUF + 1);<\/p>\n<p>strcpy(buf,<\/p>\n<p>&#8220;\u8fd9\u662f\u5728\u8fde\u63a5\u5efa\u7acb\u6210\u529f\u540e\u5411\u5ba2\u6237\u7aef\u53d1\u9001\u7684\u7b2c\u4e00\u4e2a\u6d88\u606f\/n\u53ea\u80fd\u5411new_fd\u8fd9\u4e2a\u7528accept\u51fd\u6570\u65b0\u5efa\u7acb\u7684socket\u53d1\u6d88\u606f\uff0c\u4e0d\u80fd\u5411sockfd\u8fd9\u4e2a\u76d1\u542csocket\u53d1\u9001\u6d88\u606f\uff0c\u76d1\u542csocket\u4e0d\u80fd\u7528\u6765\u63a5\u6536\u6216\u53d1\u9001\u6d88\u606f\/n&#8221;);<\/p>\n<p>\/* \u53d1\u6d88\u606f\u7ed9\u5ba2\u6237\u7aef *\/<\/p>\n<p>len = send(new_fd, buf, strlen(buf), 0);<\/p>\n<p>if (len &lt; 0) {<\/p>\n<p>printf<\/p>\n<p>(&#8220;\u6d88\u606f&#8217;%s&#8217;\u53d1\u9001\u5931\u8d25\uff01\u9519\u8bef\u4ee3\u7801\u662f%d\uff0c\u9519\u8bef\u4fe1\u606f\u662f&#8217;%s&#8217;\/n&#8221;,<\/p>\n<p>buf, errno, strerror(errno));<\/p>\n<p>} else<\/p>\n<p>printf(&#8220;\u6d88\u606f&#8217;%s&#8217;\u53d1\u9001\u6210\u529f\uff0c\u5171\u53d1\u9001\u4e86%d\u4e2a\u5b57\u8282\uff01\/n&#8221;,<\/p>\n<p>buf, len);<\/p>\n<p>bzero(buf, MAXBUF + 1);<\/p>\n<p>\/* \u63a5\u6536\u5ba2\u6237\u7aef\u7684\u6d88\u606f *\/<\/p>\n<p>len = recv(new_fd, buf, MAXBUF, 0);<\/p>\n<p>if (len &gt; 0)<\/p>\n<p>printf(&#8220;\u63a5\u6536\u6d88\u606f\u6210\u529f:&#8217;%s&#8217;\uff0c\u5171%d\u4e2a\u5b57\u8282\u7684\u6570\u636e\/n&#8221;,<\/p>\n<p>buf, len);<\/p>\n<p>else<\/p>\n<p>printf<\/p>\n<p>(&#8220;\u6d88\u606f\u63a5\u6536\u5931\u8d25\uff01\u9519\u8bef\u4ee3\u7801\u662f%d\uff0c\u9519\u8bef\u4fe1\u606f\u662f&#8217;%s&#8217;\/n&#8221;,<\/p>\n<p>errno, strerror(errno));<\/p>\n<p>\/* \u5904\u7406\u6bcf\u4e2a\u65b0\u8fde\u63a5\u4e0a\u7684\u6570\u636e\u6536\u53d1\u7ed3\u675f *\/<\/p>\n<p>}<\/p>\n<p>close(sockfd);<\/p>\n<p>return 0;<\/p>\n<p>}<\/p>\n<h3><b>\u5185\u6838\u53ea\u652f\u6301\u9694\u79bb\u6808\uff08\u72ec\u7acb\u6808\uff09\u534f\u8bae\uff1a<\/b><\/h3>\n<div class=\"image-package\">\n<div class=\"image-container\">\n<div class=\"image-container-fill\">\u00a0<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-725\" src=\"http:\/\/www.max-shu.com\/blog\/wp-content\/uploads\/2018\/03\/7412056-b7e169c769fbc720.png\" alt=\"\" width=\"700\" height=\"417\" \/><\/div>\n<\/div>\n<div class=\"image-caption\"><\/div>\n<\/div>\n<p>\u5219\u65e0\u8bba\u662f\u5ba2\u6237\u7aef\u8fd8\u662f\u670d\u52a1\u5668\u7aef\uff0c\u90fd\u5fc5\u987b\u628aipv4\u548cipv6\u5206\u5f00\u5904\u7406\uff0c<b>\u5ba2\u6237\u7aef\u4e0d\u7528\u8bf4\uff0c\u4f7f\u7528\u54ea\u7c7b\u5730\u5740\uff0c\u5c31\u4f7f\u7528\u54ea\u7c7b\u4ee3\u7801\uff08\u53c2\u8003\u4e0a\u9762\u53cc\u6808\u534f\u8bae\u5b9e\u73b0\u4e2d\u7684\u6ce8\u91ca\u6765\u652f\u6301ipv4\uff09\uff0c\u670d\u52a1\u5668\u7aef\u901a\u8fc7\u5efa\u7acb\u4e24\u4e2a\u5957\u63a5\u53e3\uff0c\u7136\u540eselect\u68c0\u6d4b\u8fdb\u6765\u8fde\u63a5\u7684\u5ba2\u6237\u7aef\u662fipv4\u8fd8\u662fipv6\u6765\u540c\u65f6\u652f\u6301ipv4\u6216ipv6\u7684\u8fde\u63a5<\/b>\uff1a<\/p>\n<p>SOCKET ServSock[FD_SETSIZE];<\/p>\n<p>ADDRINFO AI0, AI1;<\/p>\n<p>ServSock[0] = socket(AF_INET6, SOCK_STREAM, PF_INET6);<\/p>\n<p>ServSock[1] = socket(AF_INET, SOCK_STREAM, PF_INET);<\/p>\n<p>&#8230;<\/p>\n<p>bind(ServSock[0], AI0-&gt;ai_addr, AI0-&gt;ai_addrlen);<\/p>\n<p>bind(ServSock[1], AI1-&gt;ai_addr, AI1-&gt;ai_addrlen);<\/p>\n<p>&#8230;<\/p>\n<p>select(2, &amp;SockSet, 0, 0, 0);<\/p>\n<p>if (FD_ISSET(ServSocket[0], &amp;SockSet)) {<\/p>\n<p>\/\/ IPv6 connection csock = accept(ServSocket[0], (LPSOCKADDR)&amp;From, FromLen);<\/p>\n<p>&#8230;<\/p>\n<p>}<\/p>\n<p>if (FD_ISSET(ServSocket[1], &amp;SockSet))<\/p>\n<p>\/\/ IPv4 connection csock = accept(ServSocket[1], (LPSOCKADDR)&amp;From, FromLen);<\/p>\n<p>&#8230;<\/p>\n<p>}<\/p>\n<\/div>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e0b\u9762\u4e3aDaytime\u8fd9\u4e2a\u670d\u52a1\u7684\u6e90\u4ee3\u7801\u4f8b\u5b50\uff0c\u540c\u65f6\u517c\u5bb9IPV6\u548cIPV4\u7684\u5730\u5740\uff0c\u6700\u540e\u90e8\u5206\u6709\u66f4\u591a\u8bf4\u660e\u3002 \u5355\u64ad\u6a21\u5f0f\u4e0b\u7684 &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[186],"tags":[356,533,346,347],"class_list":["post-720","post","type-post","status-publish","format-standard","hentry","category-186","tag-c","tag-ipv6","tag-socket","tag-347"],"views":2580,"_links":{"self":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/720","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=720"}],"version-history":[{"count":1,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/720\/revisions"}],"predecessor-version":[{"id":726,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/720\/revisions\/726"}],"wp:attachment":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=720"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=720"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=720"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}