2012-03-29 3 views
0

Мне нужен мой клиент для привязки к определенному порту, а затем для подключения к его серверу. Проблема в том, что я привязываюсь к данному порту успешно, но не могу подключиться к серверу. Если я не пытаюсь привязываться к порту, я могу подключиться к серверу. Ниже моя программа:Клиент не может привязываться к данному порту и подключиться к данному серверу

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

В этой программе, если я использую Localhost для клиента и сервера, я в состоянии связываться с горшком и подключиться к серверу успешно. Проблема возникает, если я передаю другой IP-адрес серверу. Просьба предложить любые изменения в коде для достижения моей цели

ответ

0

Ваша проблема заключается в том, что вы связываясь с адресом 127.0.0.1. Этот адрес может использоваться только для для подключения к другим адресам обратной связи.

Вместо этого, вы должны быть настройки sin_addr члена связанного адреса INADDR_ANY:

client_addr.sin_addr.s_addr = INADDR_ANY; 
+0

Я думаю, что это client_addr.sin_addr.s_addr = INADDR_ANY; спасибо за помощь –

2

Вам не нужно связывать() на стороне клиента. Вы выполняете bind() на стороне сервера.

Эта картина может помочь вам понять

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

Update1

вы можете использовать вместо

client_addr.sin_addr.s_addr = INADDR_ANY;

+0

Мне нужен клиент для привязки к порту .. это один из моих reqrmnts ... –

+1

Иногда необходимо привязать клиента, например, если клиент работает за брандмауэром, который ограничивает доступные порты, которые может использовать клиент, или при реализации определенных протоколов, которые используют определенные порты. –

+0

@RemyLebeau согласен, почему я обновляю свой ответ. :) – llj098

0

Если вы создаете клиентского сокета, тогда вы не должны его связывать. Предполагая, что вы создаете серверный сокет, вы должны слушать.

Здесь вы смешиваете как клиент и сервер концепции

сервера

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

    } 

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

Да ... клиент привязки к определенному порту в моем требовании .. –

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