Ĺadny brzuch
Cześć!
Moglibyście mi doradzić, jak uporać się z wysyłaniem i odbieraniem pakietów w Delphi?
Muszę wysłać pakiet \377\377\377\377infostring\x00, odebrać odpowiedź i rodzielić wynik na tablicę (znak '\\')
Kod w PHP wygląda tak, jeżeli komuś to coś wyjaśni: :)
$polaczenie = fsockopen("udp://$ip", $port, $errno, $errstr); $send="\377\377\377\377infostring\x00"; fwrite($polaczenie,$send); $result = fgetc($polaczenie); $socketstatus = socket_get_status($polaczenie); $result .= fread($polaczenie, $socketstatus["unread_bytes"]); $result = substr($result, 24); $tab_info=explode("\\", $result);
Pobaw się INDY ;)
W necie na pewno znajdziesz pomoc do tego pakietu ;)
albo skorzystaj z winsocketów
Pobaw się INDY ;)
W necie na pewno znajdziesz pomoc do tego pakietu ;)
No spróbuję :P
albo skorzystaj z winsocketów
Sockety są tylko w wersji komercyjnej, nie mam tych kilku tysiaków :(
na unit1.pl jest jak na wersji personal zainstalować sockety ;]
Mniejsza z tym, próbuję za pomocą Indy.
W tej chwili kod wygląda tak:
unit Pinger; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, Menus, ValEdit, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient, IdAntiFreezeBase, IdAntiFreeze, IdSocketHandle, StdCtrls; type ToknoGlowne = class(TForm) menuGlowne: TMainMenu; Program1: TMenuItem; Wyjcie1: TMenuItem; Serwery1: TMenuItem; Dodaj1: TMenuItem; Pomoc1: TMenuItem; Autor1: TMenuItem; listaSerwerow: TStringGrid; Odwielist1: TMenuItem; udpZapytanie: TIdUDPClient; udpOdpowiedz: TIdUDPServer; IdAntiFreeze1: TIdAntiFreeze; odpowiedz: TLabel; procedure Wyjcie1Click(Sender: TObject); procedure Dodaj1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Odwielist1Click(Sender: TObject); procedure udpOdpowiedzUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); private { Private declarations } Procedure daneSerwera(ip: string; port: integer; zapytanie: string); public { Public declarations } end; var oknoGlowne: ToknoGlowne; implementation uses addsrvr; {$R *.dfm} procedure ToknoGlowne.daneSerwera(ip: string; port: integer; zapytanie: string); begin udpOdpowiedz.ReceiveTimeout := 300; udpOdpowiedz.Send(ip, port, zapytanie); end; procedure ToknoGlowne.Wyjcie1Click(Sender: TObject); begin close; end; procedure ToknoGlowne.Dodaj1Click(Sender: TObject); begin dodajSerwer.showmodal; end; procedure ToknoGlowne.FormCreate(Sender: TObject); begin listaSerwerow.Cells[0,0] := 'Nazwa'; listaSerwerow.Cells[1,0] := 'Mapa'; listaSerwerow.Cells[2,0] := 'Gracze'; listaSerwerow.Cells[3,0] := 'Ping'; end; procedure ToknoGlowne.Odwielist1Click(Sender: TObject); begin daneSerwera('85.232.244.13', 27055, '\377\377\377\377infostring\x00'); end; procedure ToknoGlowne.udpOdpowiedzUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); begin odpowiedz.Caption := udpOdpowiedz.ReceiveString; end; end.
Ale coś odpowiedz.Caption się nie zmienia :/
Użytkownik AceDude edytował ten post 08 październik 2006, 18:47
Spróbuj:var p:array[0..255]of char; begin tmemorystream(adata).ReadBuffer(p,adata.Size); p[adata.Size]:=#0; odpowiedz.Caption := p;
Użytkownik Cyrkiel edytował ten post 07 październik 2006, 21:51
dalej (_|_)
EDIT
No dobra, teraz mam takie błędy:
Po uruchomieniu i wyjściu z programu (z poziomu Delphi):
Source file not found: IdStackBSDBase.pas
Procedurę zmieniłem na taką-jaka-powinna być, czyli:
procedure ToknoGlowne.udpOdpowiedzUDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle); begin var p:array[0..255]of char; begin tmemorystream(adata).ReadBuffer(p,adata.Size); p[adata.Size]:=#0; pasekStatusu.Panels[0].Text := p; end;
ale wywala mi to:
[Error] Pinger.pas(30): Undeclared identifier: 'TBytes'
Użytkownik AceDude edytował ten post 08 październik 2006, 10:18
jak dla mnie to powienes wysylac stringa
#$FF + #$FF + #$FF + #$FF + 'infostring'
http://www.codeproje...eServerInfo.asp
A co u Ciebie robi "TBytes" ? Zostaw TStream.
Blah, postanowiłem przeżucić się na sockety, skoro mam taką możliwośc. Program obecnie wygląda tak:
unit Pinger; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, Menus, ValEdit, StdCtrls, ComCtrls, ScktComp; type ToknoGlowne = class(TForm) menuGlowne: TMainMenu; Program1: TMenuItem; Wyjcie1: TMenuItem; Serwery1: TMenuItem; Dodaj1: TMenuItem; Pomoc1: TMenuItem; Autor1: TMenuItem; listaSerwerow: TStringGrid; Odwielist1: TMenuItem; pasekStatusu: TStatusBar; zapytanie: TClientSocket; odpowiedz: TServerSocket; procedure Wyjcie1Click(Sender: TObject); procedure Dodaj1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Odwielist1Click(Sender: TObject); procedure odpowiedzAccept(Sender: TObject; Socket: TCustomWinSocket); procedure odpowiedzClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure odpowiedzClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure odpowiedzClientRead(Sender: TObject; Socket: TCustomWinSocket); private { Private declarations } public { Public declarations } end; var oknoGlowne: ToknoGlowne; implementation uses addsrvr; {$R *.dfm} procedure ToknoGlowne.Wyjcie1Click(Sender: TObject); begin close; end; procedure ToknoGlowne.Dodaj1Click(Sender: TObject); begin dodajSerwer.showmodal; end; procedure ToknoGlowne.FormCreate(Sender: TObject); begin listaSerwerow.Cells[0,0] := 'Nazwa'; listaSerwerow.Cells[1,0] := 'Mapa'; listaSerwerow.Cells[2,0] := 'Gracze'; listaSerwerow.Cells[3,0] := 'Ping'; end; procedure ToknoGlowne.Odwielist1Click(Sender: TObject); begin zapytanie.Address := '193.151.64.14'; zapytanie.Host := '193.151.64.14'; zapytanie.Port := 27015; zapytanie.Active := True; zapytanie.Open; zapytanie.Socket.SendText(chr(255)+chr(255)+chr(255)+chr(255)+'infostring'+chr(00)); odpowiedz.Port := 27015; odpowiedz.Active := True; odpowiedz.Open; end; procedure ToknoGlowne.odpowiedzAccept(Sender: TObject; Socket: TCustomWinSocket); begin pasekStatusu.Panels[0].Text := 'Połączenie zaakceptowane'; end; procedure ToknoGlowne.odpowiedzClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin pasekStatusu.Panels[0].Text := 'Błąd połączenia'; end; procedure ToknoGlowne.odpowiedzClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin pasekStatusu.Panels[0].Text := 'Połączony'; end; procedure ToknoGlowne.odpowiedzClientRead(Sender: TObject; Socket: TCustomWinSocket); begin pasekStatusu.Panels[0].Text := Socket.ReceiveText; end; end.
Ale przy próbie odświeżenia serwera (tymczasowo tylko jeden, chcę tylko, żeby to co odbierze wyświetlił w dolnym panelu, peirdółkami zajmę się później :P) dostaję błąd 10060 - jakbym nic nie wysyłał... Aha, czy potrzebuję socket server, żeby otrzymać odpowiedź??
Użytkownik AceDude edytował ten post 08 październik 2006, 18:48
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Moglibyście mi doradzić, jak uporać się z wysyłaniem i odbieraniem pakietów w Delphi?
Muszę wysłać pakiet \377\377\377\377infostring\x00, odebrać odpowiedź i rodzielić wynik na tablicę (znak '\\')
Kod w PHP wygląda tak, jeżeli komuś to coś wyjaśni: :)
$polaczenie = fsockopen("udp://$ip", $port, $errno, $errstr); $send="\377\377\377\377infostring\x00"; fwrite($polaczenie,$send); $result = fgetc($polaczenie); $socketstatus = socket_get_status($polaczenie); $result .= fread($polaczenie, $socketstatus["unread_bytes"]); $result = substr($result, 24); $tab_info=explode("\\", $result);
Pobaw się INDY ;)
W necie na pewno znajdziesz pomoc do tego pakietu ;)
albo skorzystaj z winsocketów
Pobaw się INDY ;)
W necie na pewno znajdziesz pomoc do tego pakietu ;)
No spróbuję :P
albo skorzystaj z winsocketów
Sockety są tylko w wersji komercyjnej, nie mam tych kilku tysiaków :(
na unit1.pl jest jak na wersji personal zainstalować sockety ;]
Mniejsza z tym, próbuję za pomocą Indy.
W tej chwili kod wygląda tak:
unit Pinger; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, Menus, ValEdit, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient, IdAntiFreezeBase, IdAntiFreeze, IdSocketHandle, StdCtrls; type ToknoGlowne = class(TForm) menuGlowne: TMainMenu; Program1: TMenuItem; Wyjcie1: TMenuItem; Serwery1: TMenuItem; Dodaj1: TMenuItem; Pomoc1: TMenuItem; Autor1: TMenuItem; listaSerwerow: TStringGrid; Odwielist1: TMenuItem; udpZapytanie: TIdUDPClient; udpOdpowiedz: TIdUDPServer; IdAntiFreeze1: TIdAntiFreeze; odpowiedz: TLabel; procedure Wyjcie1Click(Sender: TObject); procedure Dodaj1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Odwielist1Click(Sender: TObject); procedure udpOdpowiedzUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); private { Private declarations } Procedure daneSerwera(ip: string; port: integer; zapytanie: string); public { Public declarations } end; var oknoGlowne: ToknoGlowne; implementation uses addsrvr; {$R *.dfm} procedure ToknoGlowne.daneSerwera(ip: string; port: integer; zapytanie: string); begin udpOdpowiedz.ReceiveTimeout := 300; udpOdpowiedz.Send(ip, port, zapytanie); end; procedure ToknoGlowne.Wyjcie1Click(Sender: TObject); begin close; end; procedure ToknoGlowne.Dodaj1Click(Sender: TObject); begin dodajSerwer.showmodal; end; procedure ToknoGlowne.FormCreate(Sender: TObject); begin listaSerwerow.Cells[0,0] := 'Nazwa'; listaSerwerow.Cells[1,0] := 'Mapa'; listaSerwerow.Cells[2,0] := 'Gracze'; listaSerwerow.Cells[3,0] := 'Ping'; end; procedure ToknoGlowne.Odwielist1Click(Sender: TObject); begin daneSerwera('85.232.244.13', 27055, '\377\377\377\377infostring\x00'); end; procedure ToknoGlowne.udpOdpowiedzUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); begin odpowiedz.Caption := udpOdpowiedz.ReceiveString; end; end.
Ale coś odpowiedz.Caption się nie zmienia :/
Użytkownik AceDude edytował ten post 08 październik 2006, 18:47
Spróbuj:var p:array[0..255]of char; begin tmemorystream(adata).ReadBuffer(p,adata.Size); p[adata.Size]:=#0; odpowiedz.Caption := p;
Użytkownik Cyrkiel edytował ten post 07 październik 2006, 21:51
dalej (_|_)
EDIT
No dobra, teraz mam takie błędy:
Po uruchomieniu i wyjściu z programu (z poziomu Delphi):
Source file not found: IdStackBSDBase.pas
Procedurę zmieniłem na taką-jaka-powinna być, czyli:
procedure ToknoGlowne.udpOdpowiedzUDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle); begin var p:array[0..255]of char; begin tmemorystream(adata).ReadBuffer(p,adata.Size); p[adata.Size]:=#0; pasekStatusu.Panels[0].Text := p; end;
ale wywala mi to:
[Error] Pinger.pas(30): Undeclared identifier: 'TBytes'
Użytkownik AceDude edytował ten post 08 październik 2006, 10:18
jak dla mnie to powienes wysylac stringa
#$FF + #$FF + #$FF + #$FF + 'infostring'
http://www.codeproje...eServerInfo.asp
A co u Ciebie robi "TBytes" ? Zostaw TStream.
Blah, postanowiłem przeżucić się na sockety, skoro mam taką możliwośc. Program obecnie wygląda tak:
unit Pinger; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, Menus, ValEdit, StdCtrls, ComCtrls, ScktComp; type ToknoGlowne = class(TForm) menuGlowne: TMainMenu; Program1: TMenuItem; Wyjcie1: TMenuItem; Serwery1: TMenuItem; Dodaj1: TMenuItem; Pomoc1: TMenuItem; Autor1: TMenuItem; listaSerwerow: TStringGrid; Odwielist1: TMenuItem; pasekStatusu: TStatusBar; zapytanie: TClientSocket; odpowiedz: TServerSocket; procedure Wyjcie1Click(Sender: TObject); procedure Dodaj1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Odwielist1Click(Sender: TObject); procedure odpowiedzAccept(Sender: TObject; Socket: TCustomWinSocket); procedure odpowiedzClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure odpowiedzClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure odpowiedzClientRead(Sender: TObject; Socket: TCustomWinSocket); private { Private declarations } public { Public declarations } end; var oknoGlowne: ToknoGlowne; implementation uses addsrvr; {$R *.dfm} procedure ToknoGlowne.Wyjcie1Click(Sender: TObject); begin close; end; procedure ToknoGlowne.Dodaj1Click(Sender: TObject); begin dodajSerwer.showmodal; end; procedure ToknoGlowne.FormCreate(Sender: TObject); begin listaSerwerow.Cells[0,0] := 'Nazwa'; listaSerwerow.Cells[1,0] := 'Mapa'; listaSerwerow.Cells[2,0] := 'Gracze'; listaSerwerow.Cells[3,0] := 'Ping'; end; procedure ToknoGlowne.Odwielist1Click(Sender: TObject); begin zapytanie.Address := '193.151.64.14'; zapytanie.Host := '193.151.64.14'; zapytanie.Port := 27015; zapytanie.Active := True; zapytanie.Open; zapytanie.Socket.SendText(chr(255)+chr(255)+chr(255)+chr(255)+'infostring'+chr(00)); odpowiedz.Port := 27015; odpowiedz.Active := True; odpowiedz.Open; end; procedure ToknoGlowne.odpowiedzAccept(Sender: TObject; Socket: TCustomWinSocket); begin pasekStatusu.Panels[0].Text := 'Połączenie zaakceptowane'; end; procedure ToknoGlowne.odpowiedzClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin pasekStatusu.Panels[0].Text := 'Błąd połączenia'; end; procedure ToknoGlowne.odpowiedzClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin pasekStatusu.Panels[0].Text := 'Połączony'; end; procedure ToknoGlowne.odpowiedzClientRead(Sender: TObject; Socket: TCustomWinSocket); begin pasekStatusu.Panels[0].Text := Socket.ReceiveText; end; end.
Ale przy próbie odświeżenia serwera (tymczasowo tylko jeden, chcę tylko, żeby to co odbierze wyświetlił w dolnym panelu, peirdółkami zajmę się później :P) dostaję błąd 10060 - jakbym nic nie wysyłał... Aha, czy potrzebuję socket server, żeby otrzymać odpowiedź??
Użytkownik AceDude edytował ten post 08 październik 2006, 18:48