Приветствую.Установил бит 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 и SO_REUSEPORT.
>>что еще нужно подкрутить?
>>Спасибо!
>
>Посмотрите, чем отличаются SO_REUSEADDR и SO_REUSEPORT.
Такого параметра не нашел в своей системе (man 7 socket) - Linux ReadHat, ядро 2.4.20-8
>>Посмотрите, чем отличаются 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: вообще-то должно работать..
>В 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 и 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
...Наверное не зря оно пока закомментарено...