программирование сокетов в клиенте - PullRequest
0 голосов
/ 24 февраля 2009

Я написал эту программу на C ++ и на платформе Linux.

Я написал программу сокета клиента и сервера.

В этой клиентской программе я написал функцию сокета, и сразу после этого я выполняю некоторые другие действия, не зависящие от сокета (я написал 2 для циклов для некоторой другой логики).

После этого я подготовил структуры, требуемые для сокета, и написал функцию соединения ... в том, что я получаю ошибку как неспособную соединиться, потому что соединение возвращает -1 ..

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

В чем может быть причина, по которой я не могу получить? Пожалуйста, помогите мне в этом аспекте. Вот мой код


здесь index1 и index 2 - простые целочисленные переменные. Configstring - это массив символов, содержащий 127.0.0.1:7005 (адрес и номер порта) ... адрес и порт являются переменными массива символов для хранения адреса и номера порта.

struct sockaddr_in s1;

for(index1=0;configstring[index1]!=':';index1++)
{
    address[index1] = configstring[index1];
}
address[index1++]='\0';

for(index2=0;configstring[index1]!='\0';index1++,index2++)
{
    port[index2] = configstring[index1];
}
port[index2++]='\0';

int port_num = changeto_int(port);

if((sock_fd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
    printf("unable to create a socket\n");
    return 0;
}

s1.sin_family=AF_INET;
s1.sin_port=htons(port_num);
s1.sin_addr.s_addr=inet_addr(address);
memset(s1.sin_zero, '\0', sizeof s1.sin_zero);
int errno;

if(connect(sock_fd,(struct sockaddr *)&s1,sizeof(s1)) == -1)
{
    printf("error:unable to connect\n");
    printf("Error in connect(): %s\n", strerror( errno));
    return -1;
}

Ответы [ 9 ]

2 голосов
/ 24 февраля 2009

Во-первых, никогда не делайте что-то подобное:

int errno;

errno уже определено для вас.

Более того, я предлагаю вам использовать perror () вместо

printf("Error in connect(): %s\n", strerror( errno));

В-третьих, вы не можете вызвать printf и чем strerror (errno), потому что printf должен измениться значение errno для успеха.

В-третьих, я бы посоветовал взглянуть на примеры в Интернете и начать с них.

Я бы посоветовал прочитать man select_tut Есть много хороших примеров написанного кода. о том, как это сделать и что.

1 голос
/ 24 февраля 2009

Время от времени вы сталкиваетесь с книгой , которая стоит на голову выше всех других книг.

Если вы ДЕЙСТВИТЕЛЬНО хотите понять работу сети на уровне операционной системы (именно здесь "происходит" работа в сети), получите копию Расширенное программирование в среде UNIX (R) . Он дает вам «кишки», «историю» и «инструкции» в отношении программирования в UNIX, а также много контента, посвященного сетям и IPC.

0 голосов
/ 22 февраля 2012

попробуйте добавить:

inet_pton(AF_INET, your IP address, (void *)&server_address); 

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

0 голосов
/ 07 апреля 2009

Судя по вашему комментарию, perror() возвращает "операцию с сокетом без сокета" ... Как объявлены переменные address и port? Возможно ли, что port[index2++]='\0' как-то перезаписать на sock_fd или что-то подобное?

0 голосов
/ 07 апреля 2009

Программирование сокетов низкого уровня утомительно и подвержено ошибкам. Рекомендуем вам начать использовать фреймворки, такие как Boost или ACE , которые защищают вас от этих низкоуровневых деталей и позволяют программировать независимо от платформы.

0 голосов
/ 20 марта 2009

Не могли бы вы напечатать отладочную информацию об адресе и строке порта?

Удалите ошибку, включите и используйте perror.

Компилировать с -Wall

0 голосов
/ 07 марта 2009

struct sockaddr_in s1;

Не могли бы вы попробовать memset из s1 в начале вашей программы. Я испытал нечто похожее на это.

0 голосов
/ 24 февраля 2009

Вы просто подумали, что ваш ресивер не слушает должным образом соединения?

Как говорили другие, используйте perror, чтобы проверить errno и вывести на консоль некоторую полезную отладку.

Без вашего примера кода вы не сможете помочь. Там может быть миллион причин. Возможно, на вашей машине есть брандмауэр, блокирующий соединения? Возможно, сервер не прослушивает или использует неверный порт (вы конвертировали в сетевой порядок байтов, не так ли?). Возможно, клиент подключается к неправильному адресу или порту. Возможно, вы неправильно настроили свои структуры.

Я рекомендую прочитать Программирование сокетов Beej Doo-Daa для хорошего знакомства с сокетами в Unix (и далее по Windows).

0 голосов
/ 24 февраля 2009

Вы пытались вызвать strerror на errno? connect (), возвращающий -1, будет означать, что errno был установлен и должен иметь больше информации о вашей ошибке.

printf("Error in connect(): %s\n", strerror(errno));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...