URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4730
[ Назад ]

Исходное сообщение
"проблема с SO_REUSEADDR"

Отправлено roman , 11-Окт-05 16:31 
Приветствую.

Установил бит SO_REUSEADDR на сокет, но что-то не всегда работает должным образом, периодически ругается (при запуске приложения), что мол сокет порт занят:

...
int sd;
int yes = 1;

if ( (sd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
  perror("socket() error!");
  exit(1);
}

if ( setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1 ) {
{
  perror("setsockopt() error");
  exit(1);
}
...

if ( bind(sd, (struct sockaddr *)&serv_addr, sizeof serv_addr) == -1 ) {
  perror("bind() error");
  exit(1);
}
...

что еще нужно подкрутить?
Спасибо!


Содержание

Сообщения в этом обсуждении
"проблема с SO_REUSEADDR"
Отправлено butcher , 11-Окт-05 17:07 
>что еще нужно подкрутить?
>Спасибо!

Посмотрите, чем отличаются SO_REUSEADDR и SO_REUSEPORT.


"проблема с SO_REUSEADDR"
Отправлено roman , 12-Окт-05 08:43 
>>что еще нужно подкрутить?
>>Спасибо!
>
>Посмотрите, чем отличаются SO_REUSEADDR и SO_REUSEPORT.
Такого параметра не нашел в своей системе (man 7 socket) - Linux ReadHat, ядро 2.4.20-8

"проблема с SO_REUSEADDR"
Отправлено enot , 12-Окт-05 11:51 
>>Посмотрите, чем отличаются SO_REUSEADDR и SO_REUSEPORT.
>Такого параметра не нашел в своей системе (man 7 socket) - Linux
>ReadHat, ядро 2.4.20-8
>

В Socket API много платформозависимых нюансов.
Книга "Стивенс. Сетевое программирование." должна лежать рядом.

// Хуже не будет:
#ifdef SO_REUSEPORT
if (setsockopt(sd, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(yes)) == -1) {
  perror("setsockopt(SO_REUSEPORT) error");
  close(sd);
  exit(1);
}
#endif

ЗЫ: перед заполнением структуры serv_addr (перед bind()) надеюсь делаем:
memset(&serv_addr, 0, sizeof(serv_addr));

PS: вообще-то должно работать..


"проблема с SO_REUSEADDR"
Отправлено roman , 12-Окт-05 15:46 
>В Socket API много платформозависимых нюансов.
>Книга "Стивенс. Сетевое программирование." должна лежать рядом.
в книге тоже ничего об этом параметре не упомянуто

>
>// Хуже не будет:
>#ifdef SO_REUSEPORT
>if (setsockopt(sd, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(yes)) == -1) {
>  perror("setsockopt(SO_REUSEPORT) error");
>  close(sd);
>  exit(1);
>}
>#endif
>
>ЗЫ: перед заполнением структуры serv_addr (перед bind()) надеюсь делаем:
>memset(&serv_addr, 0, sizeof(serv_addr));
да, конечно
И тем не менее - не работает.
>
>PS: вообще-то должно работать..


"проблема с SO_REUSEADDR"
Отправлено Alexander S. SalieFF , 13-Окт-05 16:10 
>>что еще нужно подкрутить?
>>Спасибо!
>
>Посмотрите, чем отличаются SO_REUSEADDR и SO_REUSEPORT.

SO_REUSEPORT в Linux'е еще нифига не утвержден для биндинга в libc, и на большинстве систем не определен, а его функции должен пока перекрывать SO_REUSEADDR. Чтоб не быть голословным, вот выдержка из свежепроапдейченой Fedora Core 3, /usr/include/asm/socket.h :
...
#define SO_BSDCOMPAT    14
/* To add :#define SO_REUSEPORT 15 */
#define SO_PASSCRED     16
...

Наверное не зря оно пока закомментарено...