Hallo, danke schon mal für die Anregungen,
in einem anderen Forum hat sich die Diskussion in eine andere Richtung entwickelt die gut ist, aber auch noch keine Lösung gebracht hat:
forums2.atozed.com/v...6&p=31387#p31387
Aber jetzt hierzu:
@Sinspin:
Der Server ist ein embedded Gerät und steuert eine komplexe Hardware an. Implementiert ist er auf einem Ubuntu, falls das hilft?
Ich habe den Code weiter verkürzt, so dass also zwischendurch eingentlich nichts anderes passiert... Dagegen spricht auch, dass der gesamte Upload (bis zu 80 einzelne Dateien) alle über denselben Port laufen.
Wenn ich die Komponente neu erstelle und dann die Verbindung "per Standard" aufbaue, dann kommuniziert der Client ja immer auf einem anderen Port. Und das wird halt vom Server als "illegal" gewertet.
Scheint mir unwahrscheinlich, ich habe einen linksys Router als Switch dazwischen (als DHCP), ansonsten physisch nichts. Die Firewall ist ein echt hartes Ärgernis, aber die stelle ich im lokalen Netzwerk immer komplett aus.
Yep, ich nehm zwar kein Geld dafür aber ich mach das beruflich - sonst hätte ich mir vermutlich was lustigeres gesucht.
@Narses
Nein ist nicht WebDAV, die PUTs werden einfach verwendet um Firmware Dateien auf einen Standard Web Server zu legen. Was im Server damit passiert ist für mich "out of scope" - vor allem ist der Nachweis bereits erbracht, dass das funktioniert.
Ja, die Auswahl überlasse ich der Komponente, aber er darf sich trotzdem nicht ändern (der Server ist da sehr genau). Das klappt ja auch für bis zu 80 Dateien ganz gut, lediglich für den letzten Post nutzt die Komponente mit einem Male einen anderen Port... Insbesondere dazu ist auch der o.g. Link zu "forums2.atoz.com" sehr interessant.
Zur Vervollständigung: Ich habe den Code weiter verkürzt und kann es jetzt so darstellen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59:
| var data: TStringList; line, tmpFileName: String; a, pos1: Integer; dataTransferred: Cardinal; stream2: TMemoryStream; pInfo: TEMPackageInfo; buffer2: PChar; tStart: Extended; v1, v2, v3, v4: Real; begin data := TStringList.Create; data.Add( 'duration=0' ); data.Add( 'start' ); MemoLogger.AddToLog( 'Please wait for EM9046 to switch to update mode!' ); Application.ProcessMessages; httpConnector.ProtocolVersion := pv1_1; httpConnector.HTTPOptions := httpConnector.HTTPOptions + [ hoKeepOrigProtocol ]; try httpConnector.Post( UPDATE9046_HTTP_PROTOCOL + Connector.ip + ' ' + UPDATE9046_POST_UPD_START, data ); except on E: Exception do MemoLogger.AddToLog( E.Message + ' ' + IntToStr( httpConnector.ResponseCode ) + ' : ' + httpConnector.ResponseText ); end; MemoLogger.AddToLog( 'Response.Connection: ' + httpConnector.Response.Connection + ' Response.KeepAlive: ' + BoolToStr( httpConnector.Response.KeepAlive, True ) + ' Response.ProxyConnection: ' + httpConnector.Response.ProxyConnection ); Sleep( 300 ); Application.ProcessMessages; line := httpConnector.Response.Location; pos1 := Pos( UPDATE9046_HTTP_PROTOCOL, line ); pos1 := PosEx( '/', line, pos1 + Length( UPDATE9046_HTTP_PROTOCOL ) ); location := RightStr( line, Length( line ) - pos1 + 1 ); logger.Debug( 'Location: ' + location ); Sleep( 300 ); Application.ProcessMessages; data.Free; MmoUpdateWarning.Visible := True; MemoLogger.AddToLog( '+++ W A R N I N G +++ Wait for receiver to finalize; takes up to 1 hour!' ); data := TStringList.Create; data.Add( 'finalise' ); Sleep( 300 ); Application.ProcessMessages; try httpConnector.Post( UPDATE9046_HTTP_PROTOCOL + Connector.ip + ' ' + location, data ); except on E: Exception do MemoLogger.AddToLog( E.Message + ' ' + IntToStr( httpConnector.ResponseCode ) + ' : ' + httpConnector.ResponseText ); end; MemoLogger.AddToLog( 'Response.Connection: ' + httpConnector.Response.Connection + ' Response.KeepAlive: ' + BoolToStr( httpConnector.Response.KeepAlive, True ) + ' Response.ProxyConnection: ' + httpConnector.Response.ProxyConnection ); MemoLogger.AddToLog( httpConnector.Response.Connection ); logger.Debug( IntToStr( httpConnector.ResponseCode ) + ' ' + httpConnector.ResponseText ); data.Free; end; |
Der "first" und "second" POST erfolgt über abweichende Port Nummern, das dürfte m.E. nicht passieren.
Ich hab hier auch eine .pcap Datei angefertigt. Da ich die in einem Forum nicht anfügen kann, hab ich sie ins Web gelegt:
Moderiert von Narses: Extern gelinkte Datei als ZIP-Anhang hochgeladen.
Hoffe sie ist zugreifbar? Die wichtigsten Pakete darin:
Package 27 - first contact from software client to the device
package 39 - answer to the first contact - perfectly ok so far, both on port 54719
package 104 - now on port 54719 comes the FIN flag along, I suppose that's the problem?
package 108 - second request form the software client now on port 54722
package 113 - answer to the second request - as that came over different port, rejecting is "normal" behavior
Vielen Dank für alle Ideen, bisher bin ich noch auf dem falschen Weg, alle Versuche haben (noch) nichts verbessert.
vG,
Stephan