一種簡單的跨平臺套接字管道
阿新 • • 發佈:2018-12-27
{
49 SOCKET client = INVALID_SOCKET,server=INVALID_SOCKET;
50 struct addrinfo addr,*res = NULL;
51 constchar* 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,( constchar*)&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,(constchar*)&opt, sizeof(opt));
84 if(SOCKET_ERROR==bind(client,res->ai_addr,res->ai_addrlen))
85 goto fail;
86
87 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 return0;
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}
49 SOCKET client = INVALID_SOCKET,server=INVALID_SOCKET;
50 struct addrinfo addr,*res = NULL;
51 constchar* 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,(
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
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
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,(constchar*)&opt, sizeof(opt));
84 if(SOCKET_ERROR==bind(client,res->ai_addr,res->ai_addrlen))
85 goto fail;
86
87 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 return0;
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}