• ⚡️ Последний шанс: Вебинар по пентесту стартует через 30 минут!

    Друзья, ровно через 30 минут (8 июля в 19:00) начинается наш практический вебинар по пентесту и поиску уязвимостей!

    Если вы хотите:
    🕵️‍♀️ Узнать, как находить и эксплуатировать уязвимости в веб-приложениях.
    💡 Получить ценные инсайты от настоящего эксперта.
    🚀 Сделать решительный шаг в мир кибербезопасности.
    То этот вебинар для вас!

    Ведущий вебинара – Александр Медведев – эксперт с более чем 10-летним опытом в сфере информационной безопасности, пятикратный победитель Standoff и обладатель престижных сертификаций: OSWE, OSCP, PNPT, CEH, CWAPT.

    Успейте присоединиться! Зарегистрироваться сейчас

    Возникли сложности с регистрацией? Пишите нам: @Codeby_Academy
    Будем вас ждать!

Проблема с Udp и Winsock

  • Автор темы Автор темы hugi
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
H

hugi

Проблема с UDP
Есть вот такой код:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient,
StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Memo1: TMemo;
Label1: TLabel;
Button1: TButton;
UDPClient: TIdUDPClient;
UDPServer: TIdUDPServer;
procedure UDPServerUDPRead(Sender: TObject; AData: TBytes;
ABinding: TIdSocketHandle);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
UDPClient.Send(edit1.Text);
end;

procedure TForm1.UDPServerUDPRead(Sender: TObject; AData: TBytes;
ABinding: TIdSocketHandle);
var
strfmstream:TStringStream;
s:string;
begin
strfmstream:=TStringStream.Create('');
strfmstream.CopyFrom(AData,AData.Size);
Memo1.Lines.Add(ABinding.PeerIp+' '+strfmstream.DataString);
ABinding.SendTo(ABinding.PeerIp, ABinding.PeerPort, s[1], length(s));
strfmstream.free;
end;

Выдает ошибки:
[Error] Unit1.pas(18): E2003 Undeclared identifier: 'TBytes'
[Error] Unit1.pas(19): E2003 Undeclared identifier: 'TIdSocketHandle'

Эти типы данных существуют, но непонятно почему он(компилятор) их не принимает.


Проблема с WinSock
Подключаю winsock, команды WSAStartUp, WSACleanup delphi принимает, но команды WSACreateEvent, WSASelectEvent не принимает выдает ошибку.
Вот код
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, winsock;

type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Edit3: TEdit;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
List: TListBox;
Progress: TProgressBar;
edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i,j,s,opt,index:integer;
fsocket:array [0..41] of TSocket;
busy: array [0..41] of boolean;
port: array [0..41] of integer;
addr: TSockAddr;
hevent:thandle;
fset:TFdset;
tv:ttimeval;
tec:pservent;
pname:string;
ginitdata:twsadata;
begin
progress.Min:=strtoint(edit2.Text);
progress.Max:=strtoint(edit3.Text);
list.Items.Add('Начали');
list.Items.Add('=*=*=*=*=*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*=*=*=*=*=');
wsastartup(makeword(2,0),ginitdata);
i:=strtoint(edit2.Text);
addr.sin_family:=AF_INET;
addr.sin_addr.s_addr:=INADDR_ANY;
index:=40;
hevent:=wsaCreateEvent;
while i<strtoint(edit3.Text) do begin
for j:=0 to index do
busy[j]:=false;
for i:=0 to index do begin
index:=j-1;
break;
end;
fsocket[j]:=socket(af_inet,sock_stream,ipproto_ip);
wsaeventselect(fsocket[j],@addr,sizeof(addr));
addr.sin_port:=htons(i);
connect(fsocket[j],@addr,sizeof(addr));
application.ProcessMessages;
if wsagetlasterror()=wsaeinprogress then begin
closesocket(fsocket[j]);
busy[j]:=true;
end;
port[j]:=i;
i:=i+1;
end;
fd_zero(fset);
for j:=0 to index do begin
if busy[j]<>true then
fd_set(fsocket[j],fset);
end;
application.ProcessMessages;
tv.tv_sec:=1;
tv.tv_usec:=0;
s:=select(1,nil,@fset,nil,@tv);
application.ProcessMessages;
for j:=0 to index do begin
if busy[j] then continue;
if fd_isset(fsocket[j],fset) then begin
s:=sizeof(opt);
opt:=1;
getsockopt(fsocket[j],sol_socket,so_error,@opt,s);
if opt=0 then begin
tec:=getservbyport(htons(port[j]),'TCP');
if tec=nil then
pname:='unknown'
else begin
pname:=tec.s_name;
end;
list.Items.Add(inttostr(port[j])+'('+pname+')'+'открыт');
end;
end;
closesocket(fsocket[j]);
progress.Position:=i;
end;
wsacloseevent(hevent);
list.Items.Add('=*=*=*=*=*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*=*=*=*=*=');
list.Items.Add('Сканирование закончено');
wsacleanup;
end;
Ошибки
[Error] Unit1.pas(57): E2003 Undeclared identifier: 'wsaCreateEvent'
[Error] Unit1.pas(66): E2003 Undeclared identifier: 'wsaeventselect'
[Error] Unit1.pas(106): E2003 Undeclared identifier: 'wsacloseevent'

Подскажите что делать.
 
<!--QuoteBegin-hugi+13:03:2007, 17:43 -->
<span class="vbquote">(hugi @ 13:03:2007, 17:43 )</span><!--QuoteEBegin-->Проблема с WinSock
Подключаю winsock, команды WSAStartUp, WSACleanup delphi принимает, но команды WSACreateEvent, WSASelectEvent не принимает выдает ошибку.
[snapback]58909" rel="nofollow" target="_blank[/snapback]​
[/quote]На счёт WSASelectEvent ничего не могу сказать. Ты подключаешь модуль «winsock», а в нём нету функции WSACreateEvent , она появилось только в winsock2. Так что качай вторую версию.
Коггда скачаешь подключай в таком порядке:
Uses
… , Winsock, Winsock2;
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab