![]() |
AW: Winsock Example Frage
An welcher Stelle denn genau? Sieht "Data" noch plausibel aus, oder steht da bereits Müll drin?
|
AW: Winsock Example Frage
Zitat:
Delphi-Quellcode:
while ((iRecv > 0) and (iRecv <> INVALID_SOCKET)) do
begin ReceiveData(hSocket, @Buffer); ZeroMemory(@Buffer, SizeOf(Buffer)); iRecv := Recv(hSocket, Buffer, SizeOf(Buffer), 0); end; |
AW: Winsock Example Frage
Kannst Du den Code des Client mal anhängen?
|
AW: Winsock Example Frage
wäre es den hilfreich wen ich die Projekt Dateien auf mein Server uploade dann kannst es dir laden komplett???
hier der Client:
Delphi-Quellcode:
Da gibt es noch 2 weitere Units für den Client will hier Neds alles zuspammen mit so viel Code.
unit frmMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus, ComCtrls,Winsock, untListen, untClient; type TForm4 = class(TForm) StatusBar1: TStatusBar; ListView1: TListView; PopupMenu1: TPopupMenu; Listen1: TMenuItem; Disconnect1: TMenuItem; SendMessage1: TMenuItem; Label1: TLabel; procedure FormCreate(Sender: TObject); procedure Disconnect1Click(Sender: TObject); procedure SendMessage1Click(Sender: TObject); procedure Listen1Click(Sender: TObject); procedure Status(Data: AnsiString); private Listen: TListener; { Private declarations } public hServer: TSocket; intPort: Integer; { Public declarations } end; var Form4: TForm4; implementation procedure TForm4.Disconnect1Click(Sender: TObject); var TmpClient:TClient; begin if assigned(ListView1.Selected) then begin TmpClient:=ListView1.Selected.data; TmpClient.ListItem:=ListView1.Selected; TmpClient.RemoveClient; end; end; procedure TForm4.FormCreate(Sender: TObject); begin listview1.Column[2].Width := 150; end; procedure TForm4.Listen1Click(Sender: TObject); var wsaData: TWSAData; TmpStr:AnsiString; begin //Declare a port to listen on TmpStr:=InputBox('Listen port','Specify a port to open on for connections','12345'); if trim(TmpStr) <> '' then begin IntPort:=StrToInt(TmpStr); //Initialize and create our socket to accept connections with WSAStartup($0202, wsaData); Listen := TListener.Create(True); with Listen do begin FreeOnTerminate := True; wPort := intPort; Resume; end; end; end; procedure TForm4.SendMessage1Click(Sender: TObject); Var TmpClient:TClient; TmpStr:AnsiString; begin if assigned(ListView1.Selected) then begin TmpStr:=Inputbox('Send data to server','Specify message data to send','Hello from client'); if Trim(TmpStr) <> '' then begin //Declare our client for sending data TmpClient:=Listview1.selected.data; TMPClient.ListItem:=Listview1.selected; TmpClient.SendData('MSGBOX' + '|' + TmpStr); end; end; end; procedure TForm4.Status(Data: AnsiString); begin //Output our status message data StatusBar1.Panels.Items[0].Text := 'Socket Status: ' + Data; end; {$R *.dfm} end. soll ich die posten??? |
AW: Winsock Example Frage
Ich sagte ja: anhängen ;) Pack am besten das komplette Projekt in ein ZIP-Archiv.
|
AW: Winsock Example Frage
|
AW: Winsock Example Frage
Im Moment habe ich noch keine Idee, daher noch einmal die Frage: steht in der Variablen Data (Ereignis TServer.ReceiveData) bereits Müll, oder kommt das erst später? Ich habe den Verdacht, dass es an der Implementierung von Explode liegen könnte.
|
AW: Winsock Example Frage
Ja da steht schon Müll drinnen bei TServer.ReceiveData.
Und bei TServer.Connect ReceiveData und ZeroMemory steht es richtig drinne im Buffer das kann ich mit Sicherheit sagen!!! Echt cool das sie mir helfen!!! |
AW: Winsock Example Frage
Ich muss leider zugeben, dass ich keine Ahnung habe, woran das liegen könnte (bzw. ich sehe es einfach nicht). Da muss mal jemand mit einem Delphi > 2007 ran, ich kann das ja auch nicht nachvollziehen mangels Unicode, sry.
|
AW: Winsock Example Frage
Ok
Danke für die Mühe ich hoffe es findet sich da jemand das gibt es nicht oft Hilfe für umsonst. Foren sind geil :-D Also ich habe alles noch einmal genauer zusammengefasst das man nicht so viel blättern muss. Folgendes Problem: ich sende ein MSGBOX | Hallo , vom Client an den server. es kommt hier noch richtig an:
Delphi-Quellcode:
Und dann der Fehler wo ich nicht weis woran es liegt:
procedure TServer.Connect;
var Buffer: Array[0..8192] Of AnsiChar; iRecv: Integer; Begin if (WSAStartup($0202, wsaData) <> 0) then begin Writeln('Unable to start winsock, unable to continue'); Readln; Exit; end; Close := False; repeat //Prepare a listen socket to be used for our connection //and declare its host/port information hSocket := Socket(AF_INET, SOCK_STREAM, 0); Addr.sin_family := AF_INET; Addr.sin_port := htons(hPort); Addr.sin_addr.S_addr := INET_ADDR(PAnsiChar(GetIPFromHost(hHost))); Writeln('Connecting to ' + GetIPFromHost(hHost)); //Attempt the connection using our socket if (Winsock.Connect(hSocket, Addr, SizeOf(Addr)) = 0) then begin Writeln('Connected to host'); //Notify our connected client of the connection and send //our information SendData('ADDNEW|' + UserName + '|' + CompName + '|' + 'Awaiting commands'); //Attempt to receive data from our socket. ZeroMemory(@Buffer, SizeOf(Buffer)); iRecv := Recv(hSocket, Buffer, SizeOf(Buffer), 0); while ((iRecv > 0) and (iRecv <> INVALID_SOCKET)) do // <-----------Im Buffer ist alles ok begin ReceiveData(hSocket, @Buffer); // <-----------Im Buffer ist alles ok ZeroMemory(@Buffer, SizeOf(Buffer)); iRecv := Recv(hSocket, Buffer, SizeOf(Buffer), 0); end;
Delphi-Quellcode:
Und die Fragezeichen gehen so durch Explode durch und am ende bei ZeroMemory(@Buffer, SizeOf(Buffer)); ist die Nachricht wieder richtig zusehen im Buffer was ist da dazwischen was falsch ist???
procedure TServer.ReceiveData(Socket: TSocket; Buffer: PByte);
var Data: AnsiString; strArr: TDynStringArray; begin //Convert our data to a AnsiString and trim it Data := AnsiString(Buffer); Data := Trim(Data); // <-----------Im Buffer Sind nurnoch Fragezeichen if Length(Data) > 0 then begin // <-----------in Data Sind die Fragezeichen //Setup our dynamic array structure StrArr := Explode('|', Data); // <-----------in Data Sind die Fragezeichen //Display incoming message (if strArr[0] = 'MSGBOX') if StrArr[0] = 'MSGBOX' then begin MessageBox(0,PChar(StrArr[1]),'Winsock Example',MB_OK + MB_ICONINFORMATION); end; das Ganze Projekt habe ich auf mein Server hochladen und ein paar Einträge von mir weiter hinten kann man sich es runterladen mit dem Client und alles was dazugehört. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz