Здравствуйте, vers, Вы писали:
V>Да, действительно. А если данных 100 мегабайт? Пока получатель пришлет подтверждение, у клиента таймаут наступит.
Таймаут наступит только в том случае если произойдет обрыв сетевого соединения (умер получатель, или вынули сетевой кабель), тогда сам стек протоколов TCP/IP попробует несколько раз повторить передачу потерянного пакета и не получив подтверждения от принимающей стороны выдаст ошибку. А пока данные успешно передаются таймаут не сработает, если конечно вы не установите значение Socket.SendTimeout в ненулевое значение

.
Можно, конечно, разбить сообщение на маленькие блоки, только вот я не знаю пропускной способности сети, на которой будет работать приложение, да и накладные расходы возрастают. И еще: а если в процессе передачи возникнет ошибка? Ждать пока на клиенте таймаут ожидания подтверждения наступит? Как-то ненадежно все это...
Идея разбить сообщение на маленькие блоки, с подтверждением после каждой переданной порции, не лишена смысла, тогда не придется ожидать пока освободится буфер стека TCP. Размер порции можно сделать 1 килобайт, тогда она точно поместится в один TCP пакет.
V>Почитал книжку ".NET. Сетевое программирование для профессионалов." Ни слова об обработки ошибок во время передачи данных нет. А ведь сокет на каждый TCP-пакет посылает ACK-пакет подтверждения. Неужели сложно было реализовать обработку этих пакетов в .NET...
Сокеты в .NET построены на базе WinSocks, поэтому все подтверждения реализованы, иначе это был-бы уже не TCP/IP