2012-03-29 33 views
0

クライアントが特定のポートにバインドしてからサーバーに接続する必要があります。問題は、指定したポートに正常にバインドしても、サーバーに接続できない場合です。私がポートにバインドしようとしない場合、私はサーバーに接続することができます。私は、クライアントと私は鍋に結合して、サーバーに正常に接続できていますサーバーの両方にlocalhostを使用している場合は、このプログラムでクライアントが指定されたポートにバインドできず、指定されたサーバーに接続できません

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; 
} 

:以下の私のプログラムです。この問題は、サーバーに別のIPを渡すと表示されます。

答えて

0

の両方を混合しているあなたの問題は、あなたがアドレス127.0.0.1に結合していることです。このアドレスはのみ他のループバックアドレスへの接続に使用できます。

代わりに、あなたはINADDR_ANYにバインドされたアドレスのsin_addrメンバーを設定する必要があります。

client_addr.sin_addr.s_addr = INADDR_ANY; 
+0

私はそれがclient_addr.sin_addr.s_addr = INADDR_ANYだと思います。ご協力ありがとうございました –

2

クライアント側ではbind()は必要ありません。あなたはサーバー側でbind()を行います。

この写真は、あなたが作成している場合は、代わりに

client_addr.sin_addr.s_addr = INADDR_ANY;

+0

私は –

+1

...それは私のreqrmntsの1だ。..ポートにバインドするクライアントを必要とする時にはそれはする必要がありますたとえば、クライアントが使用可能なポートを制限するファイアウォールの内側で実行されている場合、または特定のポートを使用する特定のプロトコルを実装する場合など、クライアントをバインドします。 –

+0

@RemyLebeauは同意します、なぜ私は私の答えを更新します。 :) – llj098

0

使用することができます

アップデート1

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

を理解するのに役立つ可能性がありクライアントソケットを作成したら、バインドしないでください。あなたがサーバーソケットを作成しているとすれば、あなたは耳を傾けるべきです。

ここでは、クライアントとサーバーの概念

サーバー

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); 

    } 

クライアント

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

クライアントソケットを 'bind()'することは完全に許されていますが、そのような理由があることもあります。 – caf

+0

はい...私の要件の特定のポートへのクライアントのバインド.. –

関連する問題