1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #include <winsock2.h>
- int
- xmlrpc_win32_socketpair(int const domain,
- int const type,
- int const protocol,
- SOCKET socks[2]) {
- bool error;
- error = false; // initial value
- SOCKET listener;
- listener = socket(AF_INET, SOCK_STREAM, 0);
- if (listener == INVALID_SOCKET)
- error = true;
- else {
- struct sockaddr_in addr;
- memset(&addr, 0, sizeof(addr));
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = htonl(0x7f000001);
- addr.sin_port = 0;
- int rc;
- rc = bind(listener, (const struct sockaddr*) &addr, sizeof(addr));
- if (rc == SOCKET_ERROR)
- error = true;
- else {
- int addrlen;
- int rc;
- addrlen = sizeof(addr); // initial value
- rc = getsockname(listener, (struct sockaddr*) &addr, &addrlen);
- if (rc == SOCKET_ERROR)
- error = true;
- else {
- int rc;
- rc = listen(listener, 1);
- if (rc == SOCKET_ERROR)
- error = true;
- else {
- socks[0] = socket(AF_INET, SOCK_STREAM, 0);
- if (socks[0] == INVALID_SOCKET)
- error = true;
- else {
- int rc;
- rc = connect(socks[0],
- (const struct sockaddr*) &addr,
- sizeof(addr));
- if (rc == SOCKET_ERROR)
- error = true;
- else {
- socks[1] = accept(listener, NULL, NULL);
- if (socks[1] == INVALID_SOCKET)
- error = true;
- }
- if (error)
- closesocket(socks[0]);
- }
- }
- }
- }
- closesocket(listener);
- }
-
- return error ? -1 : 0;
- }
|