реклама на сайте
подробности

 
 
> проблема с SO_REUSEADDR в Linux, (работа с сокетами)
romez777
сообщение Oct 11 2005, 12:35
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Приветствую.
Установил бит 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);
}
...

что еще нужно подкрутить?
Спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Olej
сообщение Oct 12 2005, 10:26
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



Цитата(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, но нет файлов под рукой).

Если совсем уж плохо smile.gif - посмотрите вот здесь, может что подскажет:
http://qnxclub.net/files/articles/EchSrv/echsrv-107.html
http://qnxclub.net/files/articles/tcpip-qnx/tcpip-qnx.pdf

А "ругается", да ещё "периодически" smile.gif ... А вы случаем 2 экземпляра приложения не пытаетесь пустить, или 2-й (поток, например) запускать - пока 1-й ещё окончательно не завершился?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 18:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01361 секунд с 7
ELECTRONIX ©2004-2016