LINUX.ORG.RU

Клиент-сервер не работает на федоре 20

 ,


0

2

Всем привет, пишу вот свое первое клиент-серверное приложение на С, написал самые базовые функции, стиля принять-отправить сообщение. На убунте все нормально - иду на федору, компиляю, запускаю - и все виснет намертво. Путем тыкания в случайные места кода - нашел что виснет на данном вызове:

new_sock = accept(def_sock, (struct sockaddr *) &n_addr, &addr_size)

Я чего-то не знаю? Может кто сталкивался?

Код сервера: http://pastebin.com/T6t2kHir

Код клиента: http://pastebin.com/uuNfmVak

2) Пытался юзать fork() - взял стандартный пример из какой-то книжки, и не компиляется, проблема вот в этом:

void sigchld_handler(int signo)
{
	while(waitpid(-1, NULL, WHOHANG) > 0);
}

Компилятор стабильно показывает следующее:

 [test@localhost cs_app]$ make
rm -f server client
gcc -Wall -g -std=c99 -Werror server.c -o server
server.c: In function ‘sigchld_handler’:
server.c:14:26: error: ‘WHOHANG’ undeclared (first use in this function)
  while(waitpid(-1, NULL, WHOHANG) > 0);
                          ^
server.c:14:26: note: each undeclared identifier is reported only once for each function it appears in
make: *** [server] Error 1

Все хедеры включены, перерыл первые 2 страницы гугла - совершенно ничего, а если нет ответа в гугле - значит я что-то делаю не так. Может быть кто-то знает что здесь не так? Код ниже:

http://pastebin.com/XSasNSCx

Буду крайне признателен за любую помощь, хотя бы дайте какую-нибудь подсказку

Путем тыкания в случайные места кода - нашел что виснет на данном вызове accept()

Сервер не виснет, а ждёт входящего соединения от клиента.

gag ★★★★★
()
Последнее исправление: gag (всего исправлений: 1)
Ответ на: комментарий от gag

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

Kronick
() автор топика
Ответ на: комментарий от imb

Это из документации, я ее перечитывал раз за разом. Только вот компилятор продолжает говорить:

error: ‘WHOHANG’ undeclared

Kronick
() автор топика
Ответ на: комментарий от imb

О боги, и вот с этим я просидел весь вечер, спасибо огромное.

Kronick
() автор топика
Ответ на: комментарий от deadNightTiger

Выключен, фаервол тоже отключен. При запуске сервера - порт открывается и показывается что он 'Listen'

Kronick
() автор топика

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

Буду крайне признателен за любую помощь, хотя бы дайте какую-нибудь подсказку

mos ★★☆☆☆
()
Ответ на: комментарий от four_str_sam

Нет, там все ок, он зависает вот на этом моменте:

printf("Test3\n");
if ( connect(c_socket, (struct sockaddr *) &s_addr, addr_size) < 0 ) {
    printf("Connection to server can't be established\n");
    exit(1);
}
        
printf("Test4\n");

Test4 он уже не пишет

Kronick
() автор топика

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

Kronick
() автор топика

Чтобы выяснить в ком проблема используй утилиту nc. nc 127.0.0.1 5001как клиент и nc -l 5001 как сервер.

anonymous
()
/*---- Configure settings of the server address struct ----*/
    s_addr.sin_family = AF_INET;
    s_addr.sin_port = htons(5001);
    s_addr.sin_addr.s_addr = INADDR_ANY;
   
    memset(s_addr.sin_zero, '\0', sizeof s_addr.sin_zero);

Лучше очистить s_addr полностью в самом начале и не чистить кусочек потом.

После (и для) выполнения совета с nc запустить wireshark и глянуть, какие пакеты идут.

gag ★★★★★
()

На федоре 24 все работает, поддержу анонима - подключись неткатом к серверу, потом клиентом к неткату

deadNightTiger ★★★★★
()
Ответ на: комментарий от anonymous

Тут вроде бы ничего плохого:

[test@localhost cs_app]$ nc -vl 5001
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::5001
Ncat: Listening on 0.0.0.0:5001
Ncat: Connection from 127.0.0.1.
Ncat: Connection from 127.0.0.1:60581.

[test@localhost cs_app]$ nc -v 127.0.0.1 5001
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 127.0.0.1:5001.

Kronick
() автор топика
Ответ на: комментарий от gag

Как ни странно, но именно это и решило проблему, теперь в самом начале чищу область 's_addr' на клиенте и сервере таким образом:

/*---- Configure settings of the server address struct ----*/
        memset((void *) &s_addr, 0, sizeof s_addr);
        s_addr.sin_family = AF_INET;
        s_addr.sin_port = htons(5001);
        s_addr.sin_addr.s_addr = INADDR_ANY;

В итоге все работает как надо:

[test@localhost cs_app]$ ./server 
Port = '35091'
Listening
Said to client Hello World!
Client said Hello Server!
[test@localhost cs_app]$ ./client localhost
Message received from server: Hello World!
Message sent: Hello Server!
[test@localhost cs_app]$ 

Спасибо за подсказку. Что ж, еще один урок - всегда чистить память перед использованием

Kronick
() автор топика

На все вопросы есть ответы, спасибо всем кто участвовал.

Kronick
() автор топика
Ответ на: комментарий от Kronick

лучше по возможности сразу инициализировать переменные:

struct sockaddr_in s_addr {AF_INET, htons(5001), {INADDR_ANY}, {}};

legolegs ★★★★★
()

Все основные ошибки, в том числе незаполнение нулями s_addr, и как правильно делать без ошибок, написано в книге: Стивенс «Unix. Разработка сетевых приложений». Вот её надо зачитывать

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.