Цитата(romez777 @ Oct 11 2005, 15:35)
Приветствую.
Установил бит SO_REUSEADDR на сокет, но что-то не всегда работает должным образом, периодически ругается (при запуске приложения), что мол сокет порт занят:
...
if ( bind(sd, (struct sockaddr *)&serv_addr, sizeof serv_addr) == -1 ) {
perror("bind() error");
exit(1);
}
...
что еще нужно подкрутить?
Спасибо!
Всё, похоже, - так, только непонятно что там в &serv_addr ? все ли поля заполнены? Вот под рукой оказался фрагмент: это для серверного сокета (SO_REUSEADDR, как правило, применяют для серверных-прослушивающих сокетов, ... я другого не видел), это работало давно и безукоризненно:
Код
struct sockaddr_in addr;
int rc = 1, ls;
if( ( ls = socket( AF_INET, SOCK_STREAM, 0 ) ) = -1 )
errx( "create stream socket failed" );
if( setsockopt( ls, SOL_SOCKET, SO_REUSEADDR, &rc, sizeof( rc ) )
!= 0 ) errx( "set socket option failed" );
memset( &addr, 0, sizeof( addr ) );
addr.sin_len = sizeof( addr );
addr.sin_family = AF_INET;
addr.sin_port = htons( p );
addr.sin_addr.s_addr = htonl( INADDR_ANY );
if( bind( ls, (struct sockaddr*)&addr, sizeof( sockaddr ) ) != 0 )
errx( "bind socket address failed" );
if( listen( ls, 25 ) != 0 )
errx( "put socket in listen state failed" );
- посмотрите заполнение addr полей (это код QNX, но значения не имеет - стек TCP у них ... одинаково работает, я это использовал и в Linux, но нет файлов под рукой).
Если совсем уж плохо

- посмотрите вот здесь, может что подскажет:
http://qnxclub.net/files/articles/EchSrv/echsrv-107.htmlhttp://qnxclub.net/files/articles/tcpip-qnx/tcpip-qnx.pdfА "ругается", да ещё "периодически"

... А вы случаем 2 экземпляра приложения не пытаетесь пустить, или 2-й (поток, например) запускать - пока 1-й ещё окончательно не завершился?