Ключевые слова:socket, bind, blocking, (найти похожие документы)
_ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _
From : Andrew Simonenko 2:463/360.47 27 Sep 97 21:48:32
Subj : socket programming
________________________________________________________________________________
Hello Nick
26 Sep 97 Nick Evgenev wrote All.
NE> Так вот вопрос: можно ли проскипать коннекцию, которой не
NE> удается сделать accept(), и перейти к следующей?
Можно. Hасколько я понял дело ведется о виртуальном соединении (AF_INET,
SOCK_STREAM). Можно поступить двумя способами:
1. Сделать операции неблокирующие by fcntl:
listen (sock, 5);
fcntl (sock, F_SETFL, FNDELAY | fcntl (sock, F_GETFL, 0));
nsock = accept (sock, (struct sockaddr*)&client, &len)
if (errno == EWOULDBLOCK) {
/* заблокирован */
}
/* читать из nsock*/
2. Сделать мультиплексирование by select:
fd_set read_fd;
struct timeval tout;
FD_ZERO (&read_fd);
FD_SET (sock, &read_fd);
tout.tv_sec = 10; /* 10 секунд на ожидание соединения */
tout.tv_usec = 0;
if (num = select (sock + 1, &read_fd, (fd_set*)0, (fd_set*)0, &tout) == 0) {
printf ("Time out\n");
close (sock);
exit (0);
}
if (FD_ISSET (sock, &read_fd)) {
nsock = accept (sock, (struct sockaddr*)&client, &len);
/* читать из nsock */
}
Остальные строчки добавь по смыслу.
Bye.
--- FEddi 0.9pl7 via ifcico * Origin: Kiev/UA (2:463/360.47)
_ RU.UNIX (2:5077/15.22) _____________________________________________ RU.UNIX _
From : Alexandre Snarskii 2:5020/400 07 Sep 98 12:59:12
Subj : Re: bind()
________________________________________________________________________________
From: Alexandre Snarskii <[email protected]>
George Brink <[email protected]> wrote:
GB> Я тут с сокетами pаботаю... И вот иногда мне пpиходится пpибивать повисший
GB> сеpвеp. А повтоpно запустить не могу - bind() pугается что адpес уже занят.
GB> Как можно пpинудительно освободить адpес:поpт? А то я пока кpоме reboot
GB> дpугих способов не знаю :(
Во первых, по завершению работы сервера полезно говорить
shutdown(s,2);
close(s);
( s - твой сокет )
Во вторых при старте сервера полезно говорить
int yes=1;
s=socket(...) /* это у тебя и так есть :) */
setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) ;
setsockopt(s,SOL_SOCKET,SO_REUSEPORT,&yes,sizeof(yes)) ;
и только потом уже bind(s,...)
--
Alexandre Snarskii
the source code is included.
--- ifmail v.2.14dev2 * Origin: Уголочек неба.. (2:5020/400@fidonet)