Нормально ли происходит сбой WSASend во время передачи больших файлов? - PullRequest
2 голосов
/ 18 сентября 2010

Мне нужна небольшая помощь, если у кого-то есть минутка.Я написал веб-сервер, используя порты завершения ввода-вывода, но у меня возникли проблемы с отправкой больших файлов.Кажется, что веб-страницы загружаются нормально, но во время передачи больших файлов WSASend () завершается ошибкой через несколько минут с ошибкой «Указанное сетевое имя больше не доступно».

Сейчас мой сервер просто закрывает соответствующее соединениекогда любая перекрывающаяся операция завершается неудачно.Это правильная вещь?или я должен повторить неудачные операции с перекрытием несколько раз, прежде чем закрыть сокет?Я использую сокеты tcp / stream.

(исправлено) Я также получаю то, что похоже на случайные 0-байтовые пакеты от WSARecv.Я не уверен, что с этим делать, или если проблема связана. (/ Исправлено)

Спасибо за любую помощь

edit: теперь, когда сервер правильно обрабатывает соединения и имеетгораздо более полный журнал, кажется, что Лен прав.Клиент по какой-то причине закрывает соединение.

Журнал:

Initializing Windows Sockets...
Forwarding port 80...
Starting server...
Waiting for incoming connections...
Socket 1128: Client connected.
Socket 1128: Request received
Socket 1128: Sent response
Socket 1128: Error 64: SendChunk() failed. //WSASend()
Socket 1128: Closing connection - GetQueueCompletionStatus == FALSE

, поэтому возникает вопрос: зачем клиенту закрывать соединение?Это займет от 2 до 5 минут.Я уменьшил размер буфера до 4098 байт за отправку и отправляю следующий блок только после завершения первого.

Еще раз спасибо за любые идеи по этому поводу.

ps Я даже только что реализовалПовторите функцию, чтобы пять раз повторить неудачную операцию ввода-вывода, прежде чем сдаться .... все равно не повезло = (

Ответы [ 3 ]

4 голосов
/ 18 сентября 2010

Пакет нулевой длины, возвращенный из recv, указывает, что клиент на другом конце закрыл соединение.
Что отвечает, почему ваш последующий send клиенту не удалось.

http://www.opengroup.org/onlinepubs/009695399/functions/recv.html

Если нет сообщений, доступных для приема, и одноранговый узел выполнил упорядоченное завершение работы, recv () вернет 0.

2 голосов
/ 18 сентября 2010

Делаете ли вы что-нибудь, чтобы наложить какую-либо форму управления потоком на вашу передачу данных?

Если нет, то вы, вероятно, используете ресурсы, из-за которых отправка не удалась.

Например, если вы просто отправляете LOTS из WSASend() вызовов один за другим, а не расставляете их по частоте, когда они завершаются, то каждый из них будет использовать системные ресурсы (невыгружаемый пул и / или блокируемые страницы, которые идут к «предел заблокированных страниц»). Тогда вы, вероятно, в конечном итоге потерпите неудачу с ENOBUFS или подобными ошибками.

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

См. Эти вопросы для более подробной информации:

Реализация хорошо работающей очереди для отправки с TCP

Ограничение отправок TCP с помощью очереди для отправки и другие проблемы проектирования

0 голосов
/ 21 сентября 2010

Наконец-то разобрался.

от Rogers Internet Условия обслуживания:

Без ограничений, вы не можете использовать (или разрешать кому-либо еще использовать) наши Услуги:

(xvi) эксплуатировать сервер, связанный с Сервисами, включая, помимо прочего,> серверы конфигурации почты, новостей, файлов, gopher, telnet, чата, Интернета или хоста, мультимедийные> стримеры или многопользовательские интерактивные форумы;

как это неубедительно? O_o

хорошая новость: сервер работает нормально =)

edit- называется Роджерс. Они подтвердили, что меня отключают, и сказали, что мне нужна бизнес-учетная запись для запуска веб-сервера.

...