Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Закрытие сокета [D6]


Игорь_ ©   (2007-08-15 17:21:00) 

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

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:00) [1]

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

const
   MaxClient = High(Word);//êîëè÷åñòâî ñîêåòíûõ ãíåçä
   MainPort = 35000; //Ãëàâíûé ïîðò ñåðâåðà
   Lab = 'Çàãðóçêà ñåðâåðà ';
   FServer = 'Ñåðâåð';
   Diprom = 'Äèïðîì: ';
   Done = FServer + ' çàïóùåí ';
   Listen = 'Îæèäàíèå ...';
   AcceptClient = 'Ñîåäèíåíèå ñ êëèåíòîì óñòàíîâëåíî.';
   Client = 'Êëèåíò';
   Connect = 'ïîäêëþ÷åí';
   Disconnect = 'îòêëþ÷åí';
   Stop = 'îñòàíîâëåí';
   ConnectCount = 'Êîëè÷åñòâî ïîäêëþ÷åííûõ êëèåíòîâ:';
   ConnectRealyCount = 'Êîëè÷åñòâî äåéñòâèòåëüíû&# 245; êëèåíòîâ:';
   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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо