Конференция "Сети" » Telnet socket - не приходит событие FD_CLOSE [D7, WinXP]
 
  • Alex_C (27.06.11 16:16) [0]
    Обрабатываю сообщения от телнет-сокета

     try
       Event := WSACreateEvent;
       WSAEventSelect(FSock, Event, FD_CONNECT or FD_READ or FD_WRITE or FD_CLOSE);
       //описана в Winsock2
       PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);
       Connect(FSock, @Addr, Sizeof(Addr));
       while not Terminated do
       begin
         // Внимание! Application.ProcessMessages здесь ставить нельзя!
         case MsgWaitForMultipleObjects(1, Event, False, INFINITE, QS_ALLINPUT) of
           WAIT_TIMEOUT: ;
           WAIT_OBJECT_0:
           begin
             //Ev.lNetworkEvents:=FD_CONNECT or FD_READ or FD_WRITE or FD_CLOSE;
             EResult := WSAEnumNetworkEvents(FSock, Event, @Ev);
             if EResult <> 0 then
               Break;
             if GetEvent(Ev.lNetworkEvents, FD_READ) then
             begin
               if Ev.iErrorCode[FD_READ_BIT] <> 0 then
               begin
                 if Assigned(FOnErrorEvent) then
                   FOnErrorEvent(Self, Ev.iErrorCode[FD_WRITE_BIT]);
                 if Assigned(FOnNeedSynchAfterEvent) then
                   Synchronize(OnNeedSynchAfterProcedure);
                 Break;
               end
               else
               begin
                 ioctlsocket(FSock, FIONREAD, Size);
                 SetLength(Buff, Size);
                 Recv(FSock, Buff[0], Size, 0);
                 if Assigned(FOnReadEvent) then
                   FOnReadEvent(Self, Buff, Size);
                 if Assigned(FOnAfterReadEvent) then
                   Synchronize(OnAfterReadProcedure);
               end;
             end;
             if GetEvent(Ev.lNetworkEvents, FD_CONNECT) then
             begin
               if Ev.iErrorCode[FD_CONNECT_BIT] <> 0 then
               begin
                 if Assigned(FOnErrorEvent) then
                   FOnErrorEvent(Self, Ev.iErrorCode[FD_WRITE_BIT]);
                 if Assigned(FOnNeedSynchAfterEvent) then
                   Synchronize(OnNeedSynchAfterProcedure);
                 Break;
               end
               else
               begin
                 FSocketState := wsConnected;
                 if Assigned(FOnConnectEvent) then
                   FOnConnectEvent(Self);
                 if Assigned(FOnNeedSynchAfterEvent) then
                   Synchronize(OnNeedSynchAfterProcedure);
               end;
             end;
             if GetEvent(Ev.lNetworkEvents, FD_CLOSE) then
             begin
               if Ev.iErrorCode[FD_CLOSE_BIT] <> 0 then
               begin
                 if Assigned(FOnErrorEvent) then
                   FOnErrorEvent(Self, Ev.iErrorCode[FD_WRITE_BIT]);
                 if Assigned(FOnNeedSynchAfterEvent) then
                   Synchronize(OnNeedSynchAfterProcedure);
                 Break;
               end
               else
               begin
                 FSocketState := wsClosed;
                 if Assigned(FOnDisconnectEvent) then
                   FOnDisconnectEvent(Self);
                 if Assigned(FOnNeedSynchAfterEvent) then
                   Synchronize(OnNeedSynchAfterProcedure);
                 Break;
               end;
             end;
           end;



    События FD_CONNECT, FD_READ - происходят. Но когда даешь комманду отсоединиться от сокета - отсоединение происходит, а событие FD_CLOSE не происходит. В чем может быть причина?
  • Alex_C (27.06.11 16:34) [1]
    Все выяснил!
    Вопрос снимается!
  • heX (05.05.12 10:44) [2]
    Так расскажи в чем там проблема была и что поправил?
  • heX (05.05.12 10:45) [3]
    Так расскажи в чем там проблема была и что поправил?
 
Конференция "Сети" » Telnet socket - не приходит событие FD_CLOSE [D7, WinXP]
Есть новые Нет новых   [134435   +18][b:0][p:0.002]