Клиент не может подключиться к указанному порту и подключиться к данному серверу - PullRequest
0 голосов
/ 29 марта 2012

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

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-адрес серверу. Просьба предложить любые изменения в коде для достижения моей цели

Ответы [ 3 ]

2 голосов
/ 29 марта 2012

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

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

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

update1

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

client_addr.sin_addr.s_addr = INADDR_ANY;

0 голосов
/ 29 марта 2012

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

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

client_addr.sin_addr.s_addr = INADDR_ANY;
0 голосов
/ 29 марта 2012

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

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

Сервер

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