У клиента проблемы с подключением к серверу через сокеты? - PullRequest
0 голосов
/ 06 октября 2009

Мой сервер запущен и работает (подключение через telnet работало, поэтому я знаю его функционал), но мой клиент не может установить соединение. У меня такое ощущение, что это как-то связано с тем, как я заполняю структуру sockaddr_in serverAddr.

Может кто-нибудь помочь, пожалуйста? Спасибо.

int clientSocket;
char hostname[256];
struct sockaddr_in serverAddr;
struct hostent *host;
socklen_t theirAddrSize;

gethostname(hostname, sizeof(hostname));
host = gethostbyname(hostname);

memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr( host->h_name );
serverAddr.sin_port = htons( 30000 );

if ( clientSocket = socket( AF_INET, SOCK_STREAM , 0 ) == -1) {
    cerr << "socket failed ; exiting..." << endl;
    exit(1);
}

if ( connect( clientSocket , (struct sockaddr *) &serverAddr , sizeof(serverAddr) ) == -1 ) {
    cerr << "connect failed ; exiting..." << endl;
    exit(1);
}

connect всегда возвращает -1.

Ответы [ 4 ]

4 голосов
/ 06 октября 2009

Вместо inet_addr(host->h_name) используйте host->h_addr_list[0].

3 голосов
/ 06 октября 2009

Это работает?

        memcpy(&serverAddr.sin_addr,
            host->h_addr,
            sizeof(serverAddr.sin_addr));
1 голос
/ 07 октября 2009

Мне требовался memcpy, но большая часть этой головной боли возникла из-за очень бессмысленной синтаксической ошибки:

if ( clientSocket = socket( AF_INET, SOCK_STREAM , 0 ) == -1)

Мне пришлось заключить в скобки задание, прежде чем сравнивать его с -1.

if (( clientSocket = socket( AF_INET, SOCK_STREAM , 0 )) == -1)

Гах, живи ты учишься:)

1 голос
/ 06 октября 2009

Насколько я вижу, нет ничего плохого в коде, который вы разместили здесь. Это почти идентично коду клиента сокета, который я писал годами. Так что проблема либо в другом месте кода, либо в данных.

Ах - вы отредактировали код ... и добавили несколько комментариев. Хорошо, возвращаемое значение из inet_addr равно -1 (4294967295 == 0xFFFFFFFF == -1 == INADDR_NONE), поэтому вам не нравится, что вы его передаете.

Вам нужно запустить код через отладчик, сосредоточившись на вызовах gethostname и gethostbyname. Я предполагаю, что это тестовый код, поскольку вы подключаетесь к той же машине, на которой работаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...