Home > Netzwerk > HTTPSocket.Sendprogress & HTTPSocket.Post

HTTPSocket.Sendprogress & HTTPSocket.Post

Bei der Programmierung einer kleinen Anwendung zum Upload von Dateien per POST auf einen Webserver stieß ich auf das Problem, dass die Fortschrittsanzeige innerhalb von HTTPSocket.Sendprogress falsche Werte liefert. Dies begründet sich dadurch, dass ein interner TCP Puffer vor dem Upload gefüllt wird und somit beim Upload kleiner Dateien unter 1 MB (unter Mac OS X) überhaupt keine Fortschrittsanzeige mehr möglich ist. Auf der Suche nach einer Lösung hat mir Brad Hutchings von Componentx.com in der englischen Mailingliste weiterhelfen können. Innerhalb des HTTPSocket.Connected Event’s muss folgender Code eingefügt werden:

Für Mac OS X:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#if TargetMacOS
if me.Handle <> 0 then
 Declare Function setsockopt Lib "System" (s as Integer, level as integer, _
 optName as integer, optval as ptr, optlen as integer) as Integer
 
 dim x as Integer
 dim mb_optval as MemoryBlock
 
 mb_optval = NewMemoryBlock(4)
 mb_optval.Long(0) = 32 * 1024 // send buffer size 32K
 
 // SOL_SOCKET --> &hFFFF, SO_SNDBUF --> &h1001
 x = setsockopt(me.Handle, &hFFFF, &h1001, mb_optval, 4)
end 
#endif

Für Windows:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#if TargetWin32
// Set the sendbuffer size of this socket smaller so we get better
// progress feedback
Declare Function setsockopt Lib "Ws2_32" (s as Integer, level as integer, _
optName as integer, optval as ptr, optlen as integer) as Integer
 
dim x as Integer
dim mb_optval as MemoryBlock
 
mb_optval = NewMemoryBlock(4)
mb_optval.Long(0) = 32 * 1024 // send buffer size 32K
 
// SOL_SOCKET --> &hFFFF, SO_SNDBUF --> &h1001
x = setsockopt(me.Handle, &hFFFF, &h1001, mb_optval, 4)
#endif

Anschliessend erhält man die richtigen Werte ausserhalb des TCP-Puffers und kann den Fortschritt des Datei-Uploads entsprechend darstellen.

KategorienNetzwerk Tags: , ,
  1. Bisher keine Kommentare
  1. Bisher keine Trackbacks