Domanda

provo uno strano comportamento quando fa richieste HTTP attraverso prese, qui la richiesta:

POST https://example.com:443/service/XMLSelect HTTP/1.1
Content-Length: 10926
Host: example.com
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 1.0.3705)
Authorization: Basic XXX
SOAPAction: http://example.com/SubmitXml

In seguito ci va corpo della mia richiesta di data lunghezza contenuti. Dopo che ricevo qualcosa di simile:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Date: Tue, 30 Mar 2010 06:13:52 GMT

Quindi tutto sembra essere bene qui. Ho letto tutti i contenuti di flusso di rete e ricevere con successo la risposta. Ma la mia presa che sto facendo sondaggi su switch è modalità così:

write ( i write headers and request here )
read ( after headers sent i begin to receive response )
write ( STRANGE BEHAVIOUR HERE. WHY? here i send nothing really )
read ( here it switches to read back again )

ultime due operazioni possono ripetere più volte. Quindi voglio chiedere ciò che porta per la modifica della modalità di presa? E in questo caso non è un grosso problema, ma quando uso la compressione gzip nella mia richiesta (idea di come è connessi) e chiedo server per inviare risposta gzippato a me in questo modo:

POST https://example.com:443/service/XMLSelect HTTP/1.1
Content-Length: 1076
Accept-Encoding: gzip
Content-Encoding: gzip
Host: example.com
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 1.0.3705)
Authorization: Basic XXX
SOAPAction: http://example.com/SubmitXml

ricevo risposta così:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Encoding: gzip
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Date: Tue, 30 Mar 2010 07:26:33 GMT

2000
�

ricevo una dimensione del blocco e l'intestazione GZIP, è tutto a posto. Ed ecco cosa sta succedendo con la mia povera piccola presa nel frattempo:

write ( i write headers and request here )
read ( after headers sent i begin to receive response )
write ( STRANGE BEHAVIOUR HERE. And it finally sits here forever waiting for me to send something! But if i refer to HTTP I don't have to send anything more! )

Che cosa può essere correlato a? Cosa vuole che mandi? E 'il problema di server Web remoti, o ho perso qualcosa?

PS Tutti i riferimenti di servizi reali e di login / password sostituiti con quelli falsi:)

È stato utile?

Soluzione

Una presa elettrica diventa scrivibile ogni volta che c'è spazio nella presa invia tampone . Il sistema operativo non può davvero sapere se la vostra applicazione ha più dati da inviare, ma sa sulle sue strutture interne, come i buffer socket. È necessario aggiungere in modo esplicito / rimuovere il socket al fd_set scrittura per select(2) (abilitazione / disabilitazione evento EPOLLOUT per epoll(4)). Questo è di solito trattato con una macchina dello Stato , come in libevent . Anche polling funziona meglio con non bloccante prese.

Spero che questo aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top