Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];

Вниз

Закрытие сокета   Найти похожие ветки 

 
Игорь_   (2007-08-15 17:21) [0]

Уважаемые мастера.
Скажите, как поймать событие отключения сокета с правильным индексом.
По коду поймете.
Когда закрываюсь получаю не тот активный сокет.

procedure StartServer;
var
   par:Integer;
   WSAData:PWSAData;
begin
  //инициализируемся
  New(WSAData);
  if WSAStartup(MakeWord(1,1),WSAData^) <>0 then
  begin
     ErrorCode:=WSAGetLastError;
     MessageBox(0,PChar("Ошибка при загрузке Winsock. Код ошибки: " + IntToStr(ErrorCode)),ServerName,0);
     Dispose(WSAData);
     Exit;
  end;
  if WSAData <> nil then
     Dispose(WSADAta);
  ZeroMemory(@ClientSockets,Sizeof(ClientSockets));
  //создаем сокет
  sServ:= socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
  if sServ = INVALID_SOCKET then
  begin
     ErrorCode:=WSAGetLastError;
     MessageBox(0,PChar("Ошибка создания сокета. Код ошибки: " + IntToStr(ErrorCode)),ServerName,0);
     Exit;
  end;
  WinSock.ioctlsocket(sServ,FIONBIO,par);
  //связывание сокета с адресом и портом
  Addr.sin_family:=AF_INET;
  Addr.sin_port:=htons(MainPort);
  Addr.sin_addr.S_addr:=htonl(INADDR_ANY);//WinSock.inet_addr({PChar(GetLocalIP)}
  //проверим связывание
  if bind(sServ,Addr,Sizeof(Addr)) = SOCKET_ERROR then
  begin
     ErrorCode:=WSAGetLastError;
     MessageBox(0,PChar("Ошибка связывания сокета. Код ошибки: " + IntToStr(ErrorCode)),ServerName,0);
     Exit;
  end;
  //ожидание запросов клиента на соединение
  if WinSock.listen(sServ,MaxClient) = SOCKET_ERROR then
  begin
     ErrorCode:=WSAGetLastError;
     MessageBox(0,PChar("Ошибка ожидания сокета. Код ошибки: " + IntToStr(ErrorCode)),ServerName,0);
     Exit;
  end;
//   SendMessage(lab_, LB_ADDSTRING, 0, LongInt(PChar(Done + #32 + GetDate + #32 + GetTime)));
//   SendMessage(lab_, LB_ADDSTRING, 0, LongInt(PChar(Listen)));
  //связываем сообщения с окном
  WinSock.WSAAsyncSelect(sServ,LocalAPP,WM_ASYNC_CLIENTEVENT,FD_ACCEPT or FD_READ or FD_WRITE or FD_CONNECT or FD_CLOSE);
end;

function MainWndProc(hWindow: HWND; Msg: UINT; wParam: wParam;
  lParam: lParam): LRESULT; stdcall; export;
var
  ps: TPaintStruct;
begin
  Result := 0;
  case Msg of
    WM_CREATE:
     begin
        LocalAPP:=hWindow;
     end;

    WM_PAINT:
      begin
        BeginPaint(hWindow, ps);
        SetBkMode(ps.hdc, TRANSPARENT);
        EndPaint(hWindow, ps);
      end;
    WM_CLOSE:
     begin
        StopServer;
        PostQuitMessage(0);
        Result:=0
     end;
   WM_ASYNC_CLIENTEVENT:
     begin
        WSAEvent:=WinSock.WSAGetSelectEvent(lparam);
        case WSAEvent of
           FD_ACCEPT:
              begin
               //получаю число от wparam
                 AddClientToServer(wparam);
              end;
           FD_READ:
              begin

              end;
           FD_WRITE:
              begin

              end;
           FD_CLOSE:
              begin
//получаею от wparam совсем другое число, которое получилось
на соединении - как побороть ?
                 CloseActiveSocket(wParam);
                 //
              end;
        end;
        Result:=0;
     end;

    WM_DESTROY: PostQuitMessage(0);
    else
      begin
        Result := DefWindowProc(hWindow, Msg, wParam, lParam);
        Exit;
      end;
  end;
end;


 
Игорь_   (2007-08-15 17:23) [1]

Забыл назвать переменные и константы:

const
   MaxClient = High(Word);//&#234;&#238;&#235;&#232;&#247;&#229;&#241;&#242;&#226;&#238; &#241;&#238;&#234;&#229;&#242;&#237;&#251;&#245; &#227;&#237;&#229;&#231;&#228;
   MainPort = 35000; //&#195;&#235;&#224;&#226;&#237;&#251;&#233; &#239;&#238;&#240;&#242; &#241;&#229;&#240;&#226;&#229;&#240;&#224;
   Lab = "&#199;&#224;&#227;&#240;&#243;&#231;&#234;&#224; &#241;&#229;&#240;&#226;&#229;&#240;&#224; ";
   FServer = "&#209;&#229;&#240;&#226;&#229;&#240;";
   Diprom = "&#196;&#232;&#239;&#240;&#238;&#236;: ";
   Done = FServer + " &#231;&#224;&#239;&#243;&#249;&#229;&#237; ";
   Listen = "&#206;&#230;&#232;&#228;&#224;&#237;&#232;&#229; ...";
   AcceptClient = "&#209;&#238;&#229;&#228;&#232;&#237;&#229;&#237;&#232;&#229; &#241; &#234;&#235;&#232;&#229;&#237;&#242;&#238;&#236; &#243;&#241;&#242;&#224;&#237;&#238;&#226;&#235;&#229;&#237;&#238;.";
   Client = "&#202;&#235;&#232;&#229;&#237;&#242;";
   Connect = "&#239;&#238;&#228;&#234;&#235;&#254;&#247;&#229;&#237;";
   Disconnect = "&#238;&#242;&#234;&#235;&#254;&#247;&#229;&#237;";
   Stop = "&#238;&#241;&#242;&#224;&#237;&#238;&#226;&#235;&#229;&#237;";
   ConnectCount = "&#202;&#238;&#235;&#232;&#247;&#229;&#241;&#242;&#226;&#238; &#239;&#238;&#228;&#234;&#235;&#254;&#247;&#229;&#237;&#237;&#251;&#245; &#234;&#235;&#232;&#229;&#237;&#242;&#238;&#226;:";
   ConnectRealyCount = "&#202;&#238;&#235;&#232;&#247;&#229;&#241;&#242;&#226;&#238; &#228;&#229;&#233;&#241;&#242;&#226;&#232;&#242;&#229;&#235;&#252;&#237;&#251;&# 245; &#234;&#235;&#232;&#229;&#237;&#242;&#238;&#226;:";
   ServerName = Diprom + FServer + " SF-36";
   Width = 500;
   Height = 290;
   WM_ASYNC_CLIENTEVENT = WM_USER + 14;

var
  wc: TWndClass;
  hWindow: HWND;
  Msg: TMsg;
addr,ClientAddr:TSockAddrin;
  ClientSockets:array[0..MaxClient-1] of TSocket;
  sServ:TSocket;
  ErrorCode:Integer;
  localAPP:HWND;
   count:integer;
   WSAEvent:Word;



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.042 c
4-1176882413
igornov
2007-04-18 11:46
2007.10.28
Как сделать сервис скрытым?


2-1191311223
Abcdef123
2007-10-02 11:47
2007.10.28
Поясните Пример кода на использование KeyPush.DLL


15-1191366240
ERGef
2007-10-03 03:04
2007.10.28
Sun ONE Studio ME как создать jar и jad файлы??


4-1177939597
Плиз_не_пинайте
2007-04-30 17:26
2007.10.28
Поиск окон с помощью FindWindow по маске


2-1191926637
F@T@L_Err0r
2007-10-09 14:43
2007.10.28
Mutex





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский