2010-03-30 7 views
1

я испытываю странное поведение при выполнении HTTP-запросов через сокеты, вот запрос:HTTP запрос, странное поведение сокета

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 

Позже там идет тело моего запроса с заданным содержанием длиной. После этого я получаю что-то вроде:

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 

Так что все, кажется, будет хорошо здесь. Я прочитал все содержимое из сетевого потока и успешно получил ответ. Но мой сокет, который я делаю на переключателях, это такие режимы:

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) 

последние два шага могут повторяться несколько раз. Поэтому я хочу спросить, что приводит к смене режима сокета? И в данном случае это не большая проблема, но когда я использую сжатие GZIP в моей просьбе (не знаю, как это связанно) и попросить сервер для отправки сжатого ответа мне так:

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 

Я получаю ответ подобные :

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 
� 

Я получаю размер куска и заголовок GZIP, это все в порядке. И вот что происходит с моим бедным маленьким гнездом:

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!) 

О чем это может быть связано? Что он хочет, чтобы я послал? Это проблема удаленного веб-сервера или мне что-то не хватает?

PS Все фактические ссылки службы и логин/пароли заменены на поддельные :)

+0

Малые точки, но пример URL-адресов должен использовать один из зарезервированных доменов RFC2606 [http://www.rfc-editor.org/rfc/rfc2606.txt], таких как example.com - которые гарантированно никогда не указывают на живого домена, если кто-то когда-либо копирует/вставляет образец кода где-нибудь, что что-либо делает – Gareth

+0

Ops, извините, заменены на правильные :) Как насчет моего вопроса? – hoodoos

ответ

2

Сокет становится записи всякий раз, когда есть место в гнездо буфера передачи. ОС не может действительно знать, имеет ли ваше приложение больше данных для отправки, но знает о своих внутренних структурах, таких как буферы сокетов. Вы должны явно добавить/удалить сокет для записи fd_set для select(2) (включить/отключить событие EPOLLOUT для epoll(4)). Обычно это обрабатывается конечным автоматом , как в libevent. Также опрос работает лучше всего с неблокирующими разъемами.

Надеюсь, это поможет.

+0

спасибо, человек! =) Я действительно думал о буфере сам, но здорово увидеть специалиста здесь! – hoodoos

+0

есть ли способ связаться с вами, если у меня есть вопрос? :) – hoodoos

+0

Я пишу свое решение на C# и использую блокирующие сокеты, но читаю из циклов буферизации через сокеты в цикле. Я думаю, это не лучшее решение, но все же оно показывает отличную производительность, если сравнивать с асинхронными вызовами с использованием потоков. Я могу обрабатывать, как 500 сокетов, в одном потоке с нецелесообразными накладными расходами на время цикла. И мой процессор чувствует себя великолепно, имея только 10% нагрузки в среднем :) Я хотел бы отправить/получить из сокета напрямую, но я не хочу сам внедрять SSL-материал, и я использую SSLStream. Если у вас есть предложения, я бы с удовольствием услышал! – hoodoos

Смежные вопросы