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

Тема в разделе "Delphi - Сети", создана пользователем hugi, 13 мар 2007.

Статус темы:
Закрыта.
  1. hugi

    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'

    Подскажите что делать.
     
  2. GN_

    GN_ Гость

    <!--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;
     
Загрузка...
Похожие Темы - Проблема Udp Winsock
  1. c0de3r
    Ответов:
    5
    Просмотров:
    119
  2. DobermannTT
    Ответов:
    10
    Просмотров:
    133
  3. SoulPaladin
    Ответов:
    4
    Просмотров:
    125
  4. Artael
    Ответов:
    1
    Просмотров:
    109
  5. ENSLER
    Ответов:
    0
    Просмотров:
    102
Статус темы:
Закрыта.

Поделиться этой страницей