使用Winsock編寫IPv4/IPv6通用程序

本文以TCP爲例。
 
1.Server端
綁定所有註冊的地址,包括IPv4和IPv6 .
int nIndexSocket = 0 ;
SOCKET arrListenSocket[16];
char * pchPort = "8965" ;

ADDRINFOA    sHints ;
PADDRINFOA psList = NULL ;
PADDRINFOA psTemp = NULL ;

memset(&sHints,0,sizeof(ADDRINFOA));

// 要獲取綁定信息
sHints.ai_flags = AI_PASSIVE ; sHints.ai_family = AF_UNSPEC ;    
sHints.ai_socktype = SOCK_STREAM ;
sHints.ai_protocol = IPPROTO_TCP ;

getaddrinfo(NULL,pchPort,&sHints,&psList);

psTemp = psList ;
while(psTemp && nIndexSocket <16)
{
        arrListenSocket[nIndexSocket] = socket(psTemp->ai_family,psTemp->ai_socktype,psTemp->ai_protocol);

        bind(arrListenSocket[nIndexSocket],psTemp->ai_addr,psTemp->ai_addrlen);
        
        listen(arrListenSocket[nIndexSocket],5);

        // 單獨爲每個Socket處理Accept...
        HandleSocket(arrListenSocket[nIndexSocket]);

        nIndexSocket ++ ;

        psTemp = psTemp->ai_next ;

    
freeaddrinfo(psList);
 
2.Client端
void ConnectServer(const char * pchServerName,const char * pchServerPort)
{
        ADDRINFOA  sHints ;
        PADDRINFOA  psList ;

        memset(&sHints,0,sizeof(ADDRINFOA));
        sHints.ai_flags = AI_NUMERICHOST;    
        sHints.ai_family=AF_UNSPEC ;
        sHints.ai_socktype = SOCK_STREAM ;
        sHints.ai_protocol = IPPROTO_TCP ;

        getaddrinfo(pchServerName,pchServerPort,&sHints,&psList);

        SOCKET sock = socket(psList->ai_family,psList->ai_socktype,psList->ai_protocol);

        connect(sock,psList->ai_addr,psList->ai_addrlen);

        // sock : Send/Recv ....

        closesocket(sock);
        freeaddrinfo(psList)
}
 
使用IPv4連接:
ConnectServer("127.0.0.1","8965");
使用IPv6連接:
// ::1 表示Ipv6的迴路地址.
ConnectServer("::1","8965");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章