Для пересылки файла с использованием асинхронных сокетов
использую след. фрагмент кода
char buffer[4096];
DWORD dwRead;
// Read in 4096-byte blocks,
do
{
При этом выбрасывается ошибка (Операция на незаблокированном сокете не может быть завершена немедленно).
Что это значит? При пересылке небольших файлов ошибки не возникает. Проблемы начинаются при размере
более 90 kb.
Здравствуйте, yuru, Вы писали:
Y>Для пересылки файла с использованием асинхронных сокетов Y>использую след. фрагмент кода Y>char buffer[4096]; Y>DWORD dwRead; Y>// Read in 4096-byte blocks, Y>do Y>{
Y>dwRead = mailFile.Read(buffer,4096); Y>if(Send(buffer,dwRead) == SOCKET_ERROR) Y>{ Y> //ошибка Y> return false; Y>} Y>} Y>while (dwRead > 0);
Y>При этом выбрасывается ошибка (Операция на незаблокированном сокете не может быть завершена немедленно). Y>Что это значит? При пересылке небольших файлов ошибки не возникает. Проблемы начинаются при размере Y>более 90 kb.
WSAEWOULDBLOCK? Значит, ничего не пришло. Сокет-то неблокирующий. Значит, надо подождать еще.
Здравствуйте, yuru, Вы писали:
Y>Здравствуйте, crashed, Вы писали:
C>>WSAEWOULDBLOCK? Значит, ничего не пришло. Сокет-то неблокирующий. Значит, надо подождать еще.
Y>Тогда у меня два вопроса: Y>1 Почему не всегда нужно ждать?
Потому что не всегда на входе ничего нет! Y>2 Каким образом организовать ожидание? неужели sleep(n)?
Можно и так. А можно что-нибудь полезное поделать. Но лучше sleep(n) (или аналоги), чтобы дать другим потокам/процессам поработать.
А вообще-то для таких вещей есть select().
Здравствуйте, yuru, Вы писали:
Y>Для пересылки файла с использованием асинхронных сокетов
Судя по вопросам, рано вам еще асинхронные использовать.
Используйте синхронные (CSocket, наверное, называется в MFC).
Re[2]: СAsyncSocket передача данных
От:
Аноним
Дата:
21.03.06 09:02
Оценка:
Если я не ошибаюсь то при использовании асинхронных сокетов практически всегда возвращается подобная ошибка даже на не блокирующем сокете попробуй использовать функции WSA... c соответствующей моделью ввода вывода на сокетах