Ò»ÖÖ¼òµ¥µÄ¿çƽ̨Ì×½Ó×ֹܵÀ (¶þ)

2014-11-24 11:58:41 ¡¤ ×÷Õß: ¡¤ ä¯ÀÀ: 5
7 if (SOCKET_ERROR==getsockname(client,res->ai_addr,(int*)&res->ai_addrlen))
88 goto fail;
89
90 if (SOCKET_ERROR==connect(server,res->ai_addr,res->ai_addrlen))
91 goto fail;
92
93 if (SOCKET_ERROR==connect(client,ai->ai_addr,ai->ai_addrlen))
94 goto fail;
95
96 freeaddrinfo(res);
97 sock[0] = client, sock[1] = server;
98 return 0;
99
100fail:
101 if (INVALID_SOCKET!=client)
102 closesocket(client);
103 if (INVALID_SOCKET!=server)
104 closesocket(server);
105 if (res)
106 freeaddrinfo(res);
107 return -1;
108}
109
110static int win32_socketpair(int family,int type,int protocol,socket_t sock[2])
111{
112 const char* address;
113 struct addrinfo addr,*ai;
114 int ret = -1;
115
116 memset(&addr,0,sizeof(addr));
117 addr.ai_family = family;
118 addr.ai_socktype = type;
119 addr.ai_protocol = protocol;
120
121 if (AF_INET6==family)
122 address = "0:0:0:0:0:0:0:1";
123 else
124 address = "127.0.0.1";
125
126 if (0==getaddrinfo(address,"0",&addr,&ai))
127 {
128 if (SOCK_STREAM==type)
129 ret = __stream_socketpair(ai,sock);
130 else if(SOCK_DGRAM==type)
131 ret = __dgram_socketpair(ai,sock);
132 freeaddrinfo(ai);
133 }
134 return ret;
135}
136#else
137#include
138#endif
139
140int socket_pair(int family,int type,int protocol,socket_t sock[2])
141{
142#ifndef WIN32
143 return socketpair(family,type,protocol,sock);
144#else
145 return win32_socketpair(family,type,protocol,sock);
146#endif
147}

ʾÀý
1 //ipv4×Ö½ÚÁ÷Ì×½Ó×ֹܵÀ
2 ret = socket_pair(AF_INET,SOCK_STREAM,0,sock);
3 if (-1==ret) return -1;
4
5 ret = send(sock[0],"ipv4 tcp: hello sock 1\n",24,0);
6 ret = recv(sock[1],buf,sizeof(buf),0);
7 OutputDebugStringA(buf);
8
9 ret = send(sock[1],"ipv4 tcp: hello sock 0\n",24,0);
10 ret = recv(sock[0],buf,sizeof(buf),0);
11 OutputDebugStringA(buf);
12
13 //ipv4Êý¾Ý±¨Ì×½Ó×ֹܵÀ
14 ret = socket_pair(AF_INET,SOCK_DGRAM,0,sock);
15 if (-1==ret) return -1;
16
17 ret = send(sock[0],"ipv4 udp: hello sock 1\n",24,0);
18 ret = recv(sock[1],buf,sizeof(buf),0);
19 OutputDebugStringA(buf);
20
21 ret = sendto(sock[1],"ipv4 udp: hello sock 0\n",24,0,NULL,0);
22 ret = recvfrom(sock[0],buf,sizeof(buf),0,(struct sockaddr*)&r_addr,&r_len);
23 OutputDebugStringA(buf);
24
25 //ipv6×Ö½ÚÁ÷Ì×½Ó×ֹܵÀ
26 ret = socket_pair(AF_INET6,SOCK_STREAM,IPPROTO_TCP,sock);
27 if (-1==ret) return -1;
28
29 ret = send(sock[0],"ipv6 tcp: hello sock 1\n",24,0);
30 ret = recv(sock[1],buf,sizeof(buf),0);
31 OutputDebugStringA(buf);
32
33 ret = send(sock[1],"ipv6 tcp: hello sock 0\n",24,0);
34 ret = recv(sock[0],buf,sizeof(buf),0);
35 OutputDebugStringA(buf);
36
37 //ipv6Êý¾Ý±¨Ì×½Ó×ֹܵÀ
38 ret = socket_pair(AF_INET6,SOCK_DGRAM,IPPROTO_UDP,sock);
39 if (-1==ret) return -1;
40
41 ret = send(sock[0],"ipv6 udp: hello sock 1\n",24,0);
42 ret = recv(sock[1],buf,sizeof(buf),0);
43 OutputDebugStringA(buf);
44
45 ret = sendto(sock[1],"ipv6 udp: hello sock 0\n",24,0,NULL,0);
46 ret = recvfrom(sock[0],buf,sizeof(buf),0,NULL,0);
47 OutputDebugStringA(buf);
´ÓÉϿɵ㬶ÔÓÚÒÑÁ¬½ÓµÄudpÌ×½Ó×Ö£¬¿Éµ÷ÓÃrecv»òrecvfrom½ÓÊÕÊý¾Ý£¬µ÷ÓÃsend»òsendto·¢ËÍÊý¾Ý£¬µ«µ÷ÓÃsendtoÔò²»ÄÜÖ¸¶¨Ä¿±êµØÖ·¡£²âÊÔÖ÷»úÐèÖ§³ÖIPv4ºÍIPv6˫ЭÒéÕ»£¬Êä³öÈçÏ£º
ipv4 t