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

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

hugi

#1
Проблема с 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'

Подскажите что делать.
 
G
#2
<!--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;
 
Статус
Закрыто для дальнейших ответов.