Главная страница
    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.037 c
15-1190620175
Галинка
2007-09-24 11:49
2007.10.28
Редактировать под Windows, компилировать под Линуксом


1-1187006465
Dio
2007-08-13 16:01
2007.10.28
Эмулировать прокрутку колеса мыши


4-1177901326
GTR86
2007-04-30 06:48
2007.10.28
Как вывести свойства файла?


10-1139173733
Nadi
2006-02-06 00:08
2007.10.28
Выравнивание Картинки в тексте Word


2-1191687106
savyhinst
2007-10-06 20:11
2007.10.28
TType=(something1, something2, something3)





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