![]() |
Re: Client-Server-Kommunikation im LAN
@ The-X:
Schon klar. Wie gesagt, der Admin :mrgreen: @ Fischy: Ich versuch gerade verzweifelt per UDP Daten aus einem Memorystream zu versenden. Irgendwie bekomm ich die am anderen Ende nimemr zusammen. Kannst du mir helfen? |
Re: Client-Server-Kommunikation im LAN
Ich versuchs mal, kann dir aber nicht versprechen, daß das in den nächsten 2 Tagen noch was wird (gleich is feierabend :) ). Du benutzt jetzt die ICS Komponenten? Wäre vieleicht hilfreich wenn du die Source postest in der du sendest bzw. empfängst.
Gruß, Fischy |
Re: Client-Server-Kommunikation im LAN
Senderseite:
Delphi-Quellcode:
Auf der Empfängerseite hab ich nur den Stream und speicher den dann irgendwo hin. Das ist ja irrelevant.WSocket.Proto := 'udp'; WSocket.Addr := '127.0.0.1';//'10.1.1.255'; WSocket.Port := PortEdit.Text; WSocket.LocalPort := LocalPortEdit.Text; WSocket.Connect; Stream1 := TMemoryStream.Create; Image1.Picture.Bitmap.SaveToStream(Stream1); WSocket.Send(Stream1.Memory,Stream1.Size); Stream1.Free; WSocket.Close; so schauts aus:
Delphi-Quellcode:
Aber die Daten kommen in Etappen wenn mich nicht alles täuscht?!
Stream1.Setsize(WSocket.BuffSize);
WSocket.Receive(Stream1.Memory,WSocket.BufSize); Wie bastle ich die zusammen? |
Re: Client-Server-Kommunikation im LAN
Zitat:
Zitat:
Delphi-Quellcode:
Frei modifiziert nach dem Ereignis das im Beispiel UDPLSTN definiert ist, was ich auch schon geschrieben hatte.
var RcvBuf: array [0..1023] of char;
RcvLen: integer; procedure TForm1.wsServerDataAvailable(Sender: TObject; Error: Word); var Len,i: Integer; Source: TSockAddrIn; begin { Receive the data that has arrived, put it after the data already here } Len := sizeof(Source); Len := wsServer.ReceiveFrom(@RcvBuf[RcvLen],SizeOf(RcvBuf)-RcvLen-1,Source,Len); if Len <= 0 then Exit; RcvLen := RcvLen + Len; RcvBuf[RcvLen] := #0; while TRUE do begin i := StrScan(@RcvBuf, #10) - RcvBuf; if i < 0 then break; RcvBuf[i] := #0; //Communication(StrPas(RcvBuf),StrPas(inet_ntoa(Source.sin_addr))); RcvBuf[i] := #10; if i >= (RcvLen-1) then begin RcvLen := 0; break; end; { Not the last line, move the next one in front of buffer } Move(RcvBuf[i+1],RcvBuf,RcvLen-I); RcvLen := RcvLen-i-1; end; end; |
Re: Client-Server-Kommunikation im LAN
Danke erstmal!
Subnet 255.255.255.255 geht auch net, hab ich längst probiert. Wie gesagt, ich sende einfach an alle Adressen nacheinander! Werd jetzt erstmal deinen Code auseinandernehmen :mrgreen: |
Re: Client-Server-Kommunikation im LAN
Zitat:
|
Re: Client-Server-Kommunikation im LAN
Ok, mal ganz auf die Schnelle die Theorie, vieleicht hilft dir das weiter:
Bei UDP werden im gegensatz zu TCP keine Empfangsbestätigungen (ACK) vom Empfänger an den Sender zurüch geschickt. Korrupte Pakete werden einfach verworfen. Außerdem sind Duplikation, Reihenfolgevertauschung und Paketverlust möglich. Das ist eben das unsichere an UDP. Du mußt die Daten nehmen wie sie kommen. Bei TCP Paketen steht im Header eine Sequenznummer (Seq) um die Reihenfolge zu bestimmen. Die gibt es bei UDP Paketen nicht. In deinem Netzwerk sollte es aber nicht zu Fehlern kommen. Was du prinzipiell machen kannst, ist deine Anwendung die ACKs übernehmen zu lassen. Ich hab grad nochmal ein par ![]() Gruß, Fischy |
Re: Client-Server-Kommunikation im LAN
@ Tobster:
Ich dachte du sprichst auf das Subnet-Problem an. Die Verbindung mit 127.0.0.1 geht wunderbar. Warum sollte ich da 255.255.255.255 nehmen? @Fischy: Danke erstmal |
Re: Client-Server-Kommunikation im LAN
Zitat:
|
Re: Client-Server-Kommunikation im LAN
Das Broadcast-Problem ist doch schon gelöst!
Mir gehts jetzt drum ne Datei zu übertragen, hätte ich vieleicht in einen andere Thread packen können, passt aber noch recht gut zum Topic. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 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