使用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");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章