2012-03-29 10 views
0

Ich brauche meinen Client, um an einen bestimmten Port zu binden und dann eine Verbindung zu seinem Server herzustellen. Das Problem liegt vor, wenn ich erfolgreich an den angegebenen Port binde, aber keine Verbindung zum Server herstellen kann. Wenn ich nicht versuche, an den Port zu binden, kann ich mich mit dem Server verbinden. Die unten ist mein Programm:Client kann nicht an den angegebenen Port binden und eine Verbindung zum angegebenen Server herstellen

int main() 
{ 

    int sock, bytes_recieved; 
    char send_data[1024],recv_data[1024]; 
    struct hostent *host; 
    struct sockaddr_in server_addr,client_addr; 

    host = gethostbyname("127.0.0.1"); 

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
     perror("Socket"); 
     exit(1); 
    } 
    client_addr.sin_family = AF_INET; 
    client_addr.sin_port = htons(4000); 
    client_addr.sin_addr = *((struct in_addr *)host->h_addr); 
    bzero(&(client_addr.sin_zero),8); 

    //host = gethostbyname("192.168.61.67"); 
    server_addr.sin_family = AF_INET; 
    server_addr.sin_port = htons(2404); 
    server_addr.sin_addr = *((struct in_addr *)host->h_addr); 
    bzero(&(server_addr.sin_zero),8); 

    if (bind(sock, (struct sockaddr *)&client_addr, sizeof(struct sockaddr))== -1) 
    { 
     perror("Unable to bind"); 
     exit(1); 
    } 
    else 
    { 
     fprintf(stderr,"Client bound to 4000\n"); 
    } 

    if (connect(sock, (struct sockaddr *)&server_addr, 
       sizeof(struct sockaddr)) == -1) 
    { 
     perror("Connect"); 
     exit(1); 
    } 
    else 
    { 
     printf("Connected to the server\n"); 
    } 

    while(1) 
    { 

     bytes_recieved=recv(sock,recv_data,1024,0); 
     recv_data[bytes_recieved] = '\0'; 

     if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0) 
     { 
     close(sock); 
     break; 
     } 

     else 
     printf("\nRecieved data = %s " , recv_data); 

     printf("\nSEND (q or Q to quit) : "); 
     gets(send_data); 
     if (strcmp(send_data , "q") != 0 && strcmp(send_data , "Q") != 0) 
     send(sock,send_data,strlen(send_data), 0); 

     else 
     { 
     send(sock,send_data,strlen(send_data), 0); 
     close(sock); 
     break; 
     } 

    } 
return 0; 
} 

In diesem Programm, wenn ich localhost verwenden, sowohl für den Client und den Server ich in der Lage bin zu dem Topf zu binden und erfolgreich mit dem Server zu verbinden. Das Problem tritt auf, wenn ich dem Server eine andere IP-Adresse gebe. Bitte schlagen Sie Änderungen am Code vor, um mein Ziel zu erreichen.

Antwort

0

Ihr Problem ist, dass Sie an die Adresse 127.0.0.1 sind verbindlich. Diese Adresse kann nur verwendet werden, um eine Verbindung zu anderen Loopback-Adressen herzustellen.

Stattdessen sollten Sie die sin_addr Mitglied der gebundenen Adresse INADDR_ANY werden Einstellung:

client_addr.sin_addr.s_addr = INADDR_ANY; 
+0

Ich denke, es ist client_addr.sin_addr.s_addr = INADDR_ANY; Danke für Ihre Hilfe –

2

Sie brauchen bind() nicht auf der Client-Seite. Sie binden bind() auf der Serverseite.

könnte dieses Bild Sie

http://en.wikipedia.org/wiki/File:InternetSocketBasicDiagram_zhtw.png

update1

helfen zu verstehen, können Sie stattdessen

client_addr.sin_addr.s_addr = INADDR_ANY;

+0

I-Client an einen Port binden, müssen .. das ist 1 meiner reqrmnts ... –

+1

Manchmal ist es notwendig, Binden Sie einen Client, z. B. wenn der Client hinter einer Firewall ausgeführt wird, die die verfügbaren Ports beschränkt, die der Client verwenden kann, oder wenn bestimmte Protokolle implementiert werden, die bestimmte Ports verwenden. –

+0

@RemyLebeau zustimmen, warum ich meine Antwort aktualisieren. :) – llj098

0

Wenn Sie ein erstellen verwenden Client-Socket, dann sollten Sie es nicht binden. Angenommen, Sie erstellen einen Server-Socket, dann sollten Sie zuhören.

Hier können Sie sowohl Client- als auch Server-Konzept mischen

Server

SOCKET server=socket(AF_INET,SOCK_STREAM,0); 
sockaddr_in local; 
local.sin_family=AF_INET; 
local.sin_addr.s_addr=INADDR_ANY; 
local.sin_port=htons((u_short)400); 

if(bind(server,(sockaddr*)&local,sizeof(local))!=0) 
    { 
     return 0; 
    } 
if(listen(server,10)!=0) 
    { 
     return 0; 
    } 
    SOCKET client; 
    sockaddr_in from; 
    int fromlen=sizeof(from); 

    while(true)//we are looping endlessly 
    { 
     char temp[512]; 

     client=accept(server, 
      (struct sockaddr*)&from,&fromlen); 

     closesocket(client); 

    } 

Kunde

SOCKET conn; 
conn=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
sockaddr_in local; 
local.sin_family=AF_INET; 
local.sin_addr.s_addr=INADDR_ANY; 
local.sin_port=htons((u_short)400); 
if(connect(conn,(struct sockaddr*)&local,sizeof(local))) 
{ 
    //Send/Receive 
    closesocket(conn); 
    return; 
} 
+1

Es ist durchaus zulässig, einen Client-Socket zu "binden", und es gibt manchmal Gründe dafür. – caf

+0

ja ... Client Bindung an einen bestimmten Port in meiner Anforderung .. –