Показать сообщение отдельно
  #11  
Старый 05.10.2011, 07:55
Lucky192 Lucky192 вне форума
Прохожий
 
Регистрация: 04.10.2011
Сообщения: 28
Репутация: 1351
По умолчанию

Цитата:
Сообщение от Kotofff
Доброго времени суток !

А почему я не могу передать файлы более ~55Мб по вышеизложенному алгоритму ?
Т.е. все передается, но если файл более ~55мБ, то он по прибытию получается "битым", причем его размер правильный.

С Уважением.
Размер всегда будет правильный, вы же принудительно устанавливаете размер TMemoryStream по принятому в строке числу. Файлы правильнее передавать не через SendBuf, а через SendStream. И использовать нужно не TMemoryStream, а TFileStream.
В данном случае причин может быть 2:
1. Если установлен NonBlockingMode, дисконнект происходит до того как данные успеют уйти серверу.
2. Буфер передается драйверу, а у него память не резиновая - поэтому передавать за один раз такой несуразно большой буфер он может и отказаться, о чем сообщит ошибкой. Вы событие TCPClient.OnError обрабатываете? (WSA_NOT_ENOUGH_MEMORY = 8 Insufficient memory available. An application used a Windows Sockets function that directly maps to a Windows function. The Windows function is indicating a lack of required memory resources. Note that this error is returned by the operating system, so the error number may change in future releases of Windows.)

И еще у вас молоко убежало - в процедуре клиента stream не уничтожается.
Ответить с цитированием