LINUX.ORG.RU

select && SOCK_STREAM


0

0

Есть такой код простого сервера (выдержка):

#define BUFSIZE 100

char buf[BUFSIZE];
FD_ZERO(&fdset);

for( ; ;){
FD_SET(sockdes, &fdset);

rv = select(sockdes + 1, &fdset, NULL, NULL, NULL);
if( rv < 0 ) derror("select()");

if( FD_ISSET(sockdes, &fdset) ){
ssize_t rd = read(sd, buf, BUFSIZE); // Здесь ошибка
....
}
}

Сокет создан как SOCK_STREAM. При соединении с ним: ``nc localhost 5000''
результат функции постоянно равен ``-1'' (т.е. ошибки), хотя даже никаких
данных мы еще в сокет не посылали. Аналогичный код, только для SOCK_GRAM
работает великолепно.

Подскажите, пожалуйста, где здесь ошибка? Даже не знаю, в каком месте её искать.
Спасибо.

anonymous

Прошу прощения, описАлся. Читать так:

При соединении с ним: ``nc localhost 5000''
результат функции read() постоянно равен ``-1'' (т.е. ошибки), хотя FD_ISSET() -- истинно.

Спасибо.

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

Да, bind(), listen() -- все есть, ошибок они не возвращают. read()
возвращает -1, а errno после этого равно 107. А я такой код ошибки в
мане по read() не видел.

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

bash-2.05b$ man strerror
bash-2.05b$ cat /usr/include/asm/errno.h |grep 107
#define ENOTCONN        107     /* Transport endpoint is not connected */
bash-2.05b$

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

>а, bind(), listen() -- все есть, ошибок они не возвращают. read() возвращает -1

ну ты даёш.

после listen() на сокете read() никто не делает. скорее всего это невозможно.

ps:man accept

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

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

Всем спасибо за помощь! Вопрос снят ;).

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