2016-05-22 3 views
0

Я учусь программированием сокетов, когда я пытаюсь создать соединение между моим клиентом и сервером, только когда я установил следующий
client.cpp:Bind с 127.0.0.1 и INADDR_ANY

serAdd.sin_addr.s_addr=htol(INADDR_ANY); 

сервер. каст:

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

соединение может быть estalished successfully.If я изменил INADDR_ANY на 127.0.0.1, то соединение не может быть ниже established.The моя программа:

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' ожидает вас пройти целое число, не строка - или символ в вашем случае (: см. http://linux.die.net/man/3/htonl –

+0

, вы найдете это руководство полезным для практических целей - http://beej.us/guide/bgnet /output/html/singlepage/bgnet.html –

ответ

1

Использование inet_addr() для установки адреса IPv4 из "строка":

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

или

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

Для поддержки IPv6 или возможной другой схемы предстоящих адресов вы действительно хотите использовать inet_pton().

В вашем случае IPv4 это может выглядеть следующим образом:

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

Если я изменил INADDR_ANY на 127.0.0.1

Делать что-то вроде этого

... = htol("127.0.0.1"); 

должно иметь ма вы, компилятор, выкрикиваете предупреждение. Будьте осторожны.


Как noted по Chris Dodd в этом особом случае присвоения цикла обратного адреса (127.0.0.1) вы могли бы укороченные это, делая

serAdd.sin_addr.s_addr = INADDR_LOOPBACK; 
+1

Вместо этого он должен использовать inet_ntop() и inet_pton(). Они будут охватывать обе версии. –

+0

@AbhinavGauniyal: Ты прав. Я собирался добавить это. – alk

+2

В качестве альтернативы используйте 'INADDR_LOOPBACK' ... –

Смежные вопросы