сервер не может прочитать полезную нагрузку для данного HTTP POST - PullRequest
1 голос
/ 11 августа 2011

У меня есть клиент, который генерирует запрос HTTP POST, и сервер (сервер сокетов), который считывает данные, отправленные клиентом. Когда я выполняю операцию чтения на стороне сервера, сервер просто читает заголовки, как показано ниже, и не читает полезную нагрузку, отправленную клиентом. Клиент отправляет около 5 КБ полезной нагрузки, но операция чтения в сокете на сервере считывает 70 байтов данных (заголовков), хотя длина содержимого составляет 4731, как показано ниже. Я использую системные вызовы read / recv для выполнения операции чтения, может кто-нибудь сказать, почему системный вызов read / recv не может прочитать полезную нагрузку? (сервер реализован на языке программирования C)

Чтение сервером (данные не читаются) **

POST / HTTP / 1.1

Тип содержимого: test / html

Хост: 192.168.1.102:800

.

Длина содержимого: 4731

Ожидайте: 100 - продолжить

Соединение: Keep-Alive


гладит

Ответы [ 4 ]

2 голосов
/ 11 августа 2011

Здесь вам не хватает того, что сокет TCP представляет собой поток .Когда вы читаете из него, вы получаете до количества байтов, которое вы запросили , что означает, что сетевой стек ядра копирует либо размер вашего буфера, либо все байты, доступные на данный момент, в зависимости от того, что меньше.

Суть в том, что вам нужно читать из сокета TCP в цикле.Одна отправка от клиента может закончиться множественным чтением сервером и наоборот.

1 голос
/ 11 августа 2011

Нет никаких гарантий, что длина содержимого является точной. Клиент может на самом деле не отправлять тело.

Чтобы отследить проблему, чрезвычайно полезен сетевой сниффер, например Wireshark или Fiddler . При этом вы можете увидеть, действительно ли данные были отправлены. Wireshark - это универсальный сетевой анализатор, который перехватывает весь трафик, который он «видит» в сети. Fiddler фокусируется на HTTP-трафике, поэтому он может оказаться не таким полезным, если отправляемые данные не распознаются как HTTP.

1 голос
/ 11 августа 2011

Клиент, вероятно, не фактически отправляет полезную нагрузку по сети, потому что он ждет, пока ваш сервер ответит со статусом 100, прежде чем он отправит полезную нагрузку (или ваш сервер ответит 417 или другой окончательный код состояния, в этом случае он вообще не будет отправлять полезную нагрузку). Ваш сервер должен вернуть статус 417, если он видит заголовок «Expect», который он не понимает. Он также может решить понять 100-продолжить и отправить запрошенный статус 100.

Если это действительно так, клиент также ведет себя некорректно, поскольку в конечном итоге ему все равно следует отправлять полезную нагрузку, если сервер не отвечает через достаточный период времени (при условии, что сервер слишком стар, чтобы правильно обрабатывать Заголовок «Ожидайте»).

Подробнее см. RFC 2616 , в частности, раздел 8.2.3.

1 голос
/ 11 августа 2011

тип содержимого "test" / html?

...