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

2014-11-24 11:58:41 ¡¤ ×÷Õß: ¡¤ ä¯ÀÀ: 0

socket pair£¬Ò²³ÆÌ×½Ó×ֹܵÀ£¬Ö÷ÒªÓÃÀ´ÊµÏÖ½ø³ÌÄÚ»ò½ø³Ì¼äµÄÒ»¶ÔÒ»µÄȫ˫¹¤»ò°ëË«¹¤Í¨ÐÅ£¬ÔÚIO¸´ÓÃÄ£ÐÍ£¨Èçselect,poll,epollµÈ£©ÖÐÆðµ½Í¨ÖªÖжÏÍ˳öÑ­»·µÄ×÷Óã¬ÔÚÀàUNIXϵͳÖÐÒѾ­ÓÐÏֳɵÄʵÏÖ£¬APIΪsocketpair£¬µ«ÔÚWINDOWSϵͳÖÐûÓУ¬Òò´Ë±¾ÎÄÖ÷Òª½²ÊöWINDOWSƽ̨ÏÂsoketpairµÄʵÏÖ£¬Ö§³ÖIPv4ºÍIPv6ϵÄtcp¡¢udpÌ×½Ó×ֹܵÀ¡£¶ÔtcpµÄʵÏÖÔ­ÀíÊÇÒ»¶ËÔڻػ·µØÖ·ºÍij¶Ë¿ÚÉϼàÌý½ÓÊÜÁíÒ»¶ËµÄÁ¬½Ó£»¶øudpµÄʵÏÖÔ­ÀíÊÇÏÈÔÚÁ½¶Ë¸÷×԰󶨻ػ·µØÖ·ºÍij¶Ë¿Ú£¬È»ºóÉ趨¶Ô¶ËµØÖ·£¨µ÷ÓÃconnectʵÏÖ£©¡£°ó¶¨µÄ»Ø»·µØÖ·ÔÚIPv4ºÍIPv6Ï·ֱðÊÇ127.0.0.1¡¢0:0:0:0:0:0:0:1£¬¶ø¶Ë¿ÚÓÉϵͳ·ÖÅä¡£

½Ó¿Ú
1#ifdef __cplusplus
2extern "C" {
3#endif
4
5#ifdef WIN32
6#include
7#pragma comment(lib,"ws2_32.lib")
8#endif
9
10#ifdef WIN32
11#define socket_t SOCKET
12#else
13#define socket_t int
14#endif
15
16 int socket_pair(int family,int type,int protocol,socket_t sock[2]);
17
18#ifdef __cplusplus
19}
20#endif

ʵÏÖ
1#ifdef WIN32
2#include
3
4static int __stream_socketpair(struct addrinfo* ai,socket_t sock[2])
5{
6 SOCKET listener,client = INVALID_SOCKET,server = INVALID_SOCKET;
7 int opt = 1;
8
9 listener = socket(ai->ai_family,ai->ai_socktype,ai->ai_protocol);
10 if (INVALID_SOCKET==listener)
11 goto fail;
12
13 setsockopt(listener,SOL_SOCKET,SO_REUSEADDR,(const char*)&opt, sizeof(opt));
14
15 if(SOCKET_ERROR==bind(listener,ai->ai_addr,ai->ai_addrlen))
16 goto fail;
17
18 if (SOCKET_ERROR==getsockname(listener,ai->ai_addr,(int*)&ai->ai_addrlen))
19 goto fail;
20
21 if(SOCKET_ERROR==listen(listener,SOMAXCONN))
22 goto fail;
23
24 client = socket(ai->ai_family,ai->ai_socktype,ai->ai_protocol);
25 if (INVALID_SOCKET==client)
26 goto fail;
27
28 if (SOCKET_ERROR==connect(client,ai->ai_addr,ai->ai_addrlen))
29 goto fail;
30
31 server = accept(listener,0,0);
32 if (INVALID_SOCKET==server)
33 goto fail;

34
35 closesocket(listener);
36 sock[0] = client, sock[1] = server;
37 return 0;
38
39fail:
40 if(INVALID_SOCKET!=listener)
41 closesocket(listener);
42 if (INVALID_SOCKET!=client)
43 closesocket(client);
44 return -1;
45}
46
47static int __dgram_socketpair(struct addrinfo* ai,SOCKET sock[2])
48{
49 SOCKET client = INVALID_SOCKET,server=INVALID_SOCKET;
50 struct addrinfo addr,*res = NULL;
51 const char* address;
52 int opt = 1;
53
54 server = socket(ai->ai_family,ai->ai_socktype,ai->ai_protocol);
55 if (INVALID_SOCKET==server)
56 goto fail;
57
58 setsockopt(server,SOL_SOCKET,SO_REUSEADDR,(const char*)&opt, sizeof(opt));
59
60 if(SOCKET_ERROR==bind(server,ai->ai_addr,ai->ai_addrlen))
61 goto fail;
62
63 if (SOCKET_ERROR==getsockname(server,ai->ai_addr,(int*)&ai->ai_addrlen))
64 goto fail;
65
66 client = socket(ai->ai_family,ai->ai_socktype,ai->ai_protocol);
67 if (INVALID_SOCKET==client)
68 goto fail;
69
70 memset(&addr,0,sizeof(addr));
71 addr.ai_family = ai->ai_family;
72 addr.ai_socktype = ai->ai_socktype;
73 addr.ai_protocol = ai->ai_protocol;
74
75 if (AF_INET6==addr.ai_family)
76 address = "0:0:0:0:0:0:0:1";
77 else
78 address = "127.0.0.1";
79
80 if (getaddrinfo(address,"0",&addr,&res))
81 goto fail;
82
83 setsockopt(client,SOL_SOCKET,SO_REUSEADDR,(const char*)&opt, sizeof(opt));
84 if(SOCKET_ERROR==bind(client,res->ai_addr,res->ai_addrlen))
85 goto fail;
86
8