C # Socket отправляет усеченную информацию - PullRequest
0 голосов
/ 08 декабря 2011

Я пытаюсь отправить файл с помощью сокета, но почти всегда он обрезает файл при передаче, но сокет никогда не отправляет исключение, он просто не отправляет весь файл.

Пытаясь решить эту проблему, я отправляю серверу длину файла в качестве заголовка, чтобы он мог проверить, завершен ли файл, а если нет, отправить сигнал обратно с просьбой о повторной передаче.

Это работает, но иногда требуется до 250 попыток, чтобы правильно получить файл: «Как вы думаете, что происходит?» Я имею в виду отправку файла небольшими порциями, но какой размер подходит для блока? ?,

Файлы, которые не могут быть отправлены, имеют размер 80 КБ, а иногда даже файл 20 КБ дает сбой!.

какие-нибудь советы?

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

После отправки данных файла вы можете использовать метод Flush () для принудительной отправки всех локальных буферизованных данных.
При отправке TCP разбивает данные на небольшие пакеты.

При чтении данных метод Read () возвращает целое число, которое является фактически прочитанным байтом.
Всегда проверяйте, чтобы сумма, которую вы намеревались прочитать, была суммой, которую вы прочитали.

int actuallyRead = stream.Read(bufferToStoreData, 0, bytesToRead);
while (actuallyRead < bytesToRead) {
    actuallyRead  += stream.Read(bufferToStoreData, actuallyRead, bytesToRead - actuallyRead);
}
0 голосов
/ 08 декабря 2011

См. Эту ветку: Есть ли способ блокировать на сокете send (), пока мы не получим подтверждение для этого пакета?

Это так же для C #, как и для любого другого сокетаЕсли вы хотите гарантировать получение данных, вам придется сделать какое-то подтверждение на уровне приложения.

Отправитель сообщает получателю, сколько данных ожидать.Получатель читает много байтов и отвечает: «Я понял».Отправитель может свободно закрыть свое соединение или продолжить заниматься своим делом.Если отправитель закрывается до того, как получит «я получил» от получателя, данные, скорее всего, не получатся.

Относительно того, почему ваш ack уровня приложения не работает, опубликуйте некоторый код, и мы можем посмотретьна это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...