Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу разорвать пдключение 
:(
    Опции темы
lollollollol
Дата 27.4.2014, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Создал функцию, которая проверяет, открыт ли заданный порт.
Но по фаерволу видно, что часть созданных подключений НЕ закрываются.
Интересно что НЕ закрываются не все, примерно половина из проверенных.

По фаерволу видно что они висят и через час, и через два.

Вот код функции
Код

{Проверяет, открыт ли порт}
function CheckPort(domain:string;port:integer):boolean;
var
  phe:PHostEnt;
  addr:sockaddr_in;
  sock:integer;
  error:integer;
  TimeOutSSS:integer;
begin
  phe := gethostbyname(PChar(domain));                                
  if (phe=nil) then begin
    result:=False;
    exit;
  end;
  addr.sin_family := AF_INET;
  addr.sin_port   := htons(port);
  addr.sin_addr   := PInAddr(phe.h_addr_list^)^;
  sock := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (sock=INVALID_SOCKET) then begin
    result:=False;
    exit;
  end;
  TimeOutSSS:=2500;
  SetSockOpt(sock, SOL_SOCKET, SO_RCVTIMEO, @TimeOutSSS, SizeOf(TimeOutSSS));
  error := connect(sock, addr, sizeof(addr));
  if (error=SOCKET_ERROR) then begin
    result:=False;
  end else begin
    result:=True;
  end;
  Shutdown(sock, SD_BOTH);
  closesocket(sock);
end;




Вопрос:
Почему закрывается только часть подключений?
Как правильно закрыть соединение?

Спасибо

Это сообщение отредактировал(а) lollollollol - 27.4.2014, 12:43
PM MAIL   Вверх
lollollollol
Дата 27.4.2014, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Может есть догадки?

Я вообще не могу понять:(
PM MAIL   Вверх
Illusion Dolphin
Дата 28.4.2014, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 2
Всего: 63



Ну например почитать оригинал http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx особенно секцию Remarks:
Цитата

The shutdown function does not close the socket. Any resources attached to the socket will not be freed until closesocket is invoked.

To assure that all data is sent and received on a connected socket before it is closed, an application should use shutdown to close connection before calling closesocket. One method to wait for notification that the remote end has sent all its data and initiated a graceful disconnect uses the WSAEventSelect function as follows :

    Call WSAEventSelect to register for FD_CLOSE notification.
    Call shutdown with how=SD_SEND.
    When FD_CLOSE received, call the recv or WSARecv until the function completes with success and indicates that zero bytes were received. If SOCKET_ERROR is returned, then the graceful disconnect is not possible.
    Call closesocket.

Another method to wait for notification that the remote end has sent all its data and initiated a graceful disconnect uses overlapped receive calls follows :

    Call shutdown with how=SD_SEND.
    Call recv or WSARecv until the function completes with success and indicates zero bytes were received. If SOCKET_ERROR is returned, then the graceful disconnect is not possible.
    Call closesocket.



P.S. там описан несколько другой нежели у вас порядок, может дело в пропущенных деталях до closesocket ?


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
lollollollol
Дата 28.4.2014, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Не совсем понял, т.е. они "Висят" потому что на сокет были отправлены данные, а я не прочитав их решил закрыть сокет?

т.е. закрывать нужно так:

Код

WSAEventSelect(sock,WSAEvents[0],FD_CLOSE);
Shutdown(sock, SD_BOTH);
 closesocket(sock);



или нет?



Это сообщение отредактировал(а) lollollollol - 28.4.2014, 01:03
PM MAIL   Вверх
lollollollol
Дата 28.4.2014, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



WSAEventSelect нет в winsock, да и не то это.

Как правильно закрыть сокет?
PM MAIL   Вверх
lollollollol
Дата 28.4.2014, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



добавил проверку на возвращаемые значения функций  Shutdown(sock, SD_BOTH); и
  closesocket(sock);, везде возвращает ноль, как и положено

Добавлено @ 09:37
Пытался забрать всё из сокета, не помогло

Код


function shutdown(s: TSocket; how: Integer): Integer;
var
  r:integer;
  buff:array[0..10230] of char;
  TimeOutSSS:integer;
begin
  TimeOutSSS:=2000;
  SetSockOpt(s, SOL_SOCKET, SO_RCVTIMEO, @TimeOutSSS, SizeOf(TimeOutSSS));
  Recv(s,buff,sizeof(buff),0);
  r:=winsock.shutdown(s,how);
  Recv(s,buff,sizeof(buff),0);
  if (r<0) then begin
    MessageBox(0,Pchar(inttostr(s)+' shutdown'+#13#10+inttostr(WSAGetLastError)+#13#10+SysErrorMessage(WSAGetLastError)),'',0);
  end;
end;


Это сообщение отредактировал(а) lollollollol - 28.4.2014, 09:38
PM MAIL   Вверх
lollollollol
Дата 28.9.2014, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



ап, проблема актуальна
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.