Ответ AJAX недействителен в C ++, но Apache - PullRequest
2 голосов
/ 01 февраля 2011

Я хочу сделать сервер, написанный на C ++, для своей игры.Я изучил основы сокетов и написал простую программу чата, которая работала хорошо.Теперь я хочу создать HTTP-сервер, такой как Apache, но только для части запроса-ответа AJAX.

Думаю, для начала я скопировал один текст ответа Apache и отправил точный ответ на сервер C ++.Программа.

Проблема в том, что браузер (Firefox) подключается к apache и все работает нормально, за исключением того, что все запросы получают правильный ответ.

Но если я отправлю это сКлиент C ++, затем FireBug сообщает мне, что статус ответа в порядке (200), но текст ответа отсутствует.(Как это возможно?)

Этот текст ответа в точности совпадает с тем, что отправляет apache.Я сделал побитовое сравнение, и они были одинаковыми.

Файл php, который является исходным ответом

<?php echo "AS";echo  rand(0,9); ?>

И исходный код:

jQuery не требуется.

В main.cpp есть много мусорного кода, такого как функции main3 и main4, они не влияют на результат.

Я знаю, что ответы в коде C ++ не очень хороши, потому что закрытие соединенияне самый лучший;Я исправлю это позже, теперь я хочу сначала отправить успешный ответ.

Ответы [ 3 ]

2 голосов
/ 04 февраля 2011

проблема: index.html обслуживается через apache через порт 80. браузер загружает его и начинает отправку запросов. Файл запроса (программа) находился на другом порту, на порту 8888, который уже является другим сервером , который не позволяет ajax (не знаю почему) получать данные поста. программа все еще может связываться с удаленными серверами, но не может видеть ответ.

после целого дня я много тестировал с программой Fiddler, собирал ответы, и этот метод помог мне.

Я использовал программу fiddler, чтобы получить хороший ответ и получить плохой. Они были одинаковыми. После этого я выключил свое сокетное приложение и заставил fiddler автоматически ответить, а ответ из «плохого» ответа все еще не получен. Поэтому после этого я заменил плохое на хорошее и ничего не случилось. Плохой ответ с хорошим текстом, все еще плохим на порте: 8888, но другой на оригинале: порт 80 был хорош, но они были абсолютно одинаковыми, и та же программа отправила его (fiddler), я думаю, что-то не хватает, если ответ не на тот же адрес сервера (даже не тот же порт).

после этого я подумал, что, возможно, отсутствует заголовочный файл или что-то вроде этого. Поэтому я настроил Apache для прослушивания на 80 порт, загруженный в index.html. после этого я выключил сервер apache и изменил порт на 8888, и я запустил запросы ajax, и я понял, что они ошибочны, но они были отправлены apache, и все предыдущие запросы (на тот же порт) были хорошими , так что проблема только с AJAX: D

большое спасибо Тони Ли за предложение Fiddler .

На самом деле нет решения, но есть ответ, почему проблема существует.

1 голос
/ 04 февраля 2011

Не совсем ответ на ваш вопрос, но вы можете найти его полезным.

Вместо кода Apache вы можете попробовать libevent . Он имеет функции только для создания http-серверов и, вероятно, будет намного быстрее, чем код Apache.

Проверьте эту ссылку . Есть некоторая информация о построении http-сервера с libevent.

1 голос
/ 02 февраля 2011

Я не знаю, как вы проверяете побитно - если вы использовали fiddler для захвата трафика, тогда это загадка.

Я предполагаю, что неотправленные буферизованные данные теряются при закрытии сокета.См. Статью MSDN Изящное завершение работы, параметры задержки и закрытия гнезда .Вызовите shutdown () перед вызовом closesocket (), чтобы обеспечить чистое отключение.

...