Форум: "Начинающим";
Текущий архив: 2008.09.28;
Скачать: [xml.tar.bz2];
ВнизЗакрытие сокета Найти похожие ветки
← →
prodex (2008-08-08 11:51) [0]При закрытии сокета функция CloseSocket возвращает 0, т.е. нормальное завершение, но при повторном связывании на этот же порт выдает ошибку 10048. В чем причина?
← →
Rouse_ © (2008-08-08 11:57) [1]Работай примерно по такому алгоритму:
if bind(FServer, FSockAddr, SizeOf(FSockAddr)) = SOCKET_ERROR then
begin
Err := WSAGetLastError;
if Err <> WSAEADDRINUSE then
begin
Error(Err, "TGSCustomServerSocket.Initialize [Err <> WSAEADDRINUSE after bind = SOCKET_ERROR]");
Exit;
end;
Opt := 1; // Если адрес используется попробуем всеже сесть на него
if setsockopt(FServer, SOL_SOCKET, SO_REUSEADDR, @Opt, SizeOf(Opt)) = SOCKET_ERROR then
begin
Error(Err, "TGSCustomServerSocket.Initialize [setsockopt = SOCKET_ERROR]");
Exit;
end;
if bind(FServer, FSockAddr, SizeOf(FSockAddr)) = SOCKET_ERROR then
begin
Error(Err, "TGSCustomServerSocket.Initialize [second bind = SOCKET_ERROR]");
Exit;
end;
end;
← →
Сергей М. © (2008-08-08 12:31) [2]
> В чем причина?
В ошибке в твоей программе.
← →
alex-drob © (2008-08-08 13:20) [3]а это не то:
Если соединение разрывается (самой программой или из-за проблем в сети), эти сокеты уже не могут быть использованы для установления нового соединения: они должны быть уничтожены, а вместо них созданы новые сокеты.
из статьи http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021
← →
prodex (2008-08-14 13:32) [4]Из-за чего сокет может не закрыться? Хотя функция закрытия возвращает 0?
← →
Сергей М. © (2008-08-14 13:37) [5]
> prodex (14.08.08 13:32) [4]
В справке достаточно инф-ции по поведению сокета.
Читал справку-то ?
← →
prodex (2008-08-14 13:41) [6]Да. На вопрос ответите?
← →
Сергей М. © (2008-08-14 13:46) [7]
> Да
Ты наверно буквы там искал знакомые, а не читал)
> На вопрос ответите?
Да на здоровье)
Цитата из справки, которую ты якобы "читал":
if SO_DONTLINGER enabled (the default setting) it always returns immediately - connection is gracefully closed "in the background"
If SO_DONTLINGER is set on a stream socket (that is, the l_onoff field of the linger structure is zero; see Multipoint and Multicast Semantics) the closesocket call will return immediately. However, any data queued for transmission will be sent if possible before the underlying socket is closed. This is also called a graceful disconnect. Note that in this case, the Windows Sockets provider cannot release the socket and other resources for an arbitrary period, which can affect applications which expect to use all available sockets. This is the default behavior
← →
prodex (2008-08-14 13:49) [8]Как "отловить" момент, когда все данные будут переданы? Сработает какое-то событие?
← →
Rouse_ © (2008-08-14 13:54) [9]
> На вопрос ответите?
Ну если читал, то должен знать, что при закрытии сокета, соединение некоторое время находится в состоянии TIME_WAIT
← →
Rouse_ © (2008-08-14 13:58) [10]Вообще советую изучить вот эти ресурсы:
http://www.infocentr.ru/~bugaga/tcpip/index.html
http://book.itep.ru/1/intro1.htm
← →
Rouse_ © (2008-08-14 13:58) [11]а также книги:
http://rouse.drkb.ru/books.php#stivens
http://rouse.drkb.ru/books.php#olifer
Стивенс предпочтительней, вторая книжка чуть похуже, но тоже не плохо.
(разбил на два сообщения, бо много ссылок не пускает :)
← →
prodex (2008-08-14 14:05) [12]
> Rouse_ © (14.08.08 13:58) [11]
>
> а также книги:
> http://rouse.drkb.ru/books.php#stivens
> http://rouse.drkb.ru/books.php#olifer
Спасибо большое, оч интересно. Теперь есть занятие :)
← →
Сергей М. © (2008-08-14 14:12) [13]
> Как "отловить" момент, когда все данные будут переданы?
> Сработает какое-то событие?
Ну опять же справка:
One technique that can be used to minimize the chance of problems occurring during connection teardown is to avoid relying on an implicit shutdown being initiated by closesocket. Instead, use one of the two explicit shutdown functions, shutdown or WSASendDisconnect ). This in turn will cause an FD_CLOSE indication to be received by the peer application indicating that all pending data has been received. To illustrate this, the following table shows the functions that would be invoked by the client and server components of an application, where the client is responsible for initiating a graceful shutdown.
Client Side Server Side
(1) Invoke shutdown(s, SD_SEND) to signal end of session and that client has no more data to send.
(2) Receive FD_CLOSE, indicating graceful shutdown in progress and that all data has been received.
(3) Send any remaining response data.
(5") Get FD_READ and invoke recv to get any response data sent by server (4) Invoke shutdown(s, SD_SEND) to indicate server has no more data to send.
(5) Receive FD_CLOSE indication (4") Invoke closesocket
(6) Invoke closesocket
← →
prodex (2008-08-14 14:42) [14]
> Сергей М. ©
Хорошо. Скажи, где ошибка в логике? Работает серверный сокет, к нему конектиться клиент (далее Клиент), сервер создает клиента на своей стороне (Серверный Клиент). Никаких данных не передавая, т.е. функция Send не вызывалась. Клиент закрывает соединение CloseSocket, функция возвращает 0. В этот момент в Серверном Клиенте срабатывает событие FD_Close, что соответственно вызывает функцию CloseSocket, она тоже возвращает 0. Теперь, когда заново поднимаю Клиента, выдает ошибку 10048. По прошествии минут 5-10 порт освобождается, и все начинается заново. Что-нить подскажешь? Что здесь не так?
← →
Сергей М. © (2008-08-14 14:49) [15]
> Теперь, когда заново поднимаю Клиента, выдает ошибку 10048
т.е. ситуация на стороне клиента в псевдокоде выглядит вот так:
socket
bind
connect
closesocket
socket
bind <- здесь отказ с кодом WSAEADDRINUSE = 10048
?
← →
Rouse_ © (2008-08-14 14:49) [16]shutdown вызываешь перед CloseSocket?
← →
prodex (2008-08-14 14:59) [17]Пробовал, не помогло. Отказ после Connect
← →
Сергей М. © (2008-08-14 15:08) [18]
> Отказ после Connect
А зачем ты привязываешь клиента к указаннгому тобой фиксированному порту ?
← →
Сергей М. © (2008-08-14 15:12) [19]http://www.microsoft.com/Rus/Msdn/Magazine/2005/08/Winsock.mspx
читай внимательно "Клиентские приложения, использующие сокеты"
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.09.28;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.081 c