1. 程式人生 > >一種簡單的跨平臺套接字管道

一種簡單的跨平臺套接字管道

{
 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}