2016-05-22 4 views
0

Ich lerne Socket-Programmierung, wenn ich versuche, eine Verbindung zwischen meinem Client und dem Server zu erstellen, nur wenn ich wie folgt festgelegt
client.cpp:Bind mit 127.0.0.1 und INADDR_ANY

serAdd.sin_addr.s_addr=htol(INADDR_ANY); 

Server. cav:

serAdd.sin_addr.s_addr=htol(INADDR_ANY); 
    bind(server,(const sockaddr *)&serAdd,sizeof(serAdd); 

die Verbindung estalished werden kann successfully.If I INADDR_ANY auf 127.0.0.1 geändert, wird die Verbindung nicht unter established.The werden kann, ist mein Programm:

client.cpp:

#define portNum 6666 
int main() 
{ 
    int client,i; 
    sockaddr_in serAdd; 
    char *ip="127.0.0.1"; 


    client=socket(AF_INET,SOCK_STREAM,0); 
    if(client<0) 
    { 
     cout<<"Fail to create socket..."<<endl; 
     return 0; 
    } 

    cout<<"Creating connection..."<<endl; 

    serAdd.sin_family=AF_INET; 
    serAdd.sin_addr.s_addr=htonl(*ip); 
    serAdd.sin_port=htons(portNum); 

    if(connect(client,(const sockaddr *)&serAdd,sizeof(serAdd))==0) 
    { 
     cout<<"Connected!"<<endl; 
     cin>>i; 
    } 
    else 
    { 
     cout<<"Connect failed..."<<endl; 
     cin>>i; 
    } 
} 

server.cpp:

#define portNum 6666 
int main() 
{ 
    int client,server; 
    sockaddr_in serAdd, 
      cliAdd; 
    char *ip="127.0.0.1"; 

    server=socket(AF_INET,SOCK_STREAM,0); 
    if(server<0) 
    { 
     cout<<"Fail to create socket..."<<endl; 
     return 0; 
    } 

    cout<<"Binding..."<<endl; 

    serAdd.sin_family=AF_INET; 
    serAdd.sin_addr.s_addr=htonl(INADDR_ANY); 
    serAdd.sin_port=htons(portNum); 

    if(bind(server,(const sockaddr *)&serAdd,sizeof(serAdd))==0) 
    { 
     cout<<"Binding succed!..."<<endl; 
    } 
    else 
    { 
     cout<<"Binding failed..."<<endl; 
     return 0; 
    } 

if(listen(server,1)==0) 
{ 
    cout<<"Listening..."<<endl; 
} 
else 
{ 
    cout<<"Listening failed..."<<endl; 
    return 0; 
} 

socklen_t size=sizeof(cliAdd); 
while(1) 
    { 
     if(accept(server,(sockaddr *)&cliAdd,&size)>=0) 
      cout<<"Connection created!"<<endl; 
     else 
     { 
      cout<<"accept failed..."<<endl; 
      return 0; 
     } 
    } 
} 
+3

'htonl' erwartet Sie eine ganze Zahl passiert, nicht eine Zeichenfolge - oder ein Zeichen in Ihrem Fall (: http://linux.die.net/man/3/htonl –

+0

finden Sie diese Anleitung nützlich für praktische Zwecke - http://beej.us/guide/bgnet /output/html/singlepage/bgnet.html –

Antwort

1

Verwenden inet_addr() die IPv4-Adresse von einem "String" zu setzen:

serAdd.sin_addr.s_addr = inet_addr("127.0.0.1"); 

oder

inet_aton("127.0.0.1", &serAdd.sin_addr); 

Um IPv6 oder ein anderes ankommendes Adressschema zu unterstützen, möchten Sie wirklich inet_pton() verwenden.

In Ihrem IPv4 Fall dies könnte wie folgt aussehen:

inet_pton(AF_INET, "127.0.0.1", &serAdd.sin_addr); 

Wenn ich INADDR_ANY

tun so etwas wie dieses

... = htol("127.0.0.1"); 
127.0.0.1 geändert

sollte ma haben de Sie Compiler schreien eine Warnung an Sie. Warnungen ernst nehmen.


Wie noted von Chris Dodd in diesem speziellen Fall von der Loopback-Adresse zuweisen (127.0.0.1) Sie diese

indem abkürzen könnten
serAdd.sin_addr.s_addr = INADDR_LOOPBACK; 
+1

Er sollte stattdessen inet_ntop() & inet_pton() verwenden, sie werden beide Versionen abdecken .. –

+0

@AbhinavGauniyal: Du hast Recht. Ich wollte das hinzufügen. – alk

+2

Alternativ verwenden Sie 'INADDR_LOOPBACK' ... –