Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1218819253
batya-x
2008-08-15 20:54
2008.09.28
Обои на рабочем столе


15-1217935394
data
2008-08-05 15:23
2008.09.28
Посоветуйте цифровую видеокамеру.


15-1216037491
sD
2008-07-14 16:11
2008.09.28
Структура приложение на Delphi + MS SQL


2-1219108231
Abcdef123
2008-08-19 05:10
2008.09.28
настройка среды Delphi 2007


6-1193220112
Alex_C
2007-10-24 14:01
2008.09.28
HTTPS и POST метод





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский