Главная страница
    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.038 c
3-1182251256
ambhtr
2007-06-19 15:07
2007.10.28
Создание DBF файлов


1-1186824165
Александр_К
2007-08-11 13:22
2007.10.28
Сокеты


15-1191555132
Wood
2007-10-05 07:32
2007.10.28
Поиск файлов и Spybot...


2-1191865439
smartleds
2007-10-08 21:43
2007.10.28
Господа , подскажите плз как завести массивы для открываемых


2-1191912772
Scarllett
2007-10-09 10:52
2007.10.28
? OnClick event для страницы в MS EI





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