Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.28;
Скачать: CL | DM;

Вниз

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

 
Игорь_   (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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
2-1191562040
Штучка
2007-10-05 09:27
2007.10.28
Как зафиксировать столбцы в DBGridEh


2-1191669091
Tereshko
2007-10-06 15:11
2007.10.28
Подскажите пожалуйста


2-1191209766
koha
2007-10-01 07:36
2007.10.28
Работа с сервисами - помогите.


2-1191514478
Pacific
2007-10-04 20:14
2007.10.28
Можно ли...


2-1191764984
alikon1
2007-10-07 17:49
2007.10.28
Изображение в БД