powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема с событием FD_WRITE (асинхронные сокеты)?
13 сообщений из 13, страница 1 из 1
Проблема с событием FD_WRITE (асинхронные сокеты)?
    #34878479
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Если можно, помогите разобраться как правильно обрабатывать событие FD_WRITE. Я отслеживаю события FD_READ, FD_CONNECT, FD_READ, FD_CLOSE. Событие FD_WRITE вознимает один раз, я передаю данные, а потом оно перестаёт вырабатываться. В обработчике FD_WRITE что-то вроде этого:

if (wsEvents.lNetworkEvents & FD_WRITE)
{
if (wsEvents.iErrorCode[FD_WRITE_BIT])
{
printf("FD_WRITE ERROR %d\n",wsEvents.iErrorCode[FD_WRITE_BIT]);
return 1;
}
else
{
retVal = send(s,buffer,10,0);

if (retVal == SOCKET_ERROR)
{
retVal = WSAGetLastError();
if (retVal != WSAEWOULDBLOCK)
{
printf("FD_WRITE ERROR 2\n");
return 1;
}
else
{
printf("Writing is blocked\n");
}
}
else
printf("The data has been sent\n");
}
}


Спасибо.
...
Рейтинг: 0 / 0
Проблема с событием FD_WRITE (асинхронные сокеты)?
    #34878500
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причём это событие генерируется сразу после FD_CONNECT, а затем не вырабатывается.
...
Рейтинг: 0 / 0
Проблема с событием FD_WRITE (асинхронные сокеты)?
    #34878613
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может ли кто-нибудь пояснить загадочную фразу из MSDN:
Таким образом приложение может полагать, что отправка возможна, начиная с первого события FD_WRITE и до тех пора, пока send, WSASend не вернёт
Therefore, an application can assume that sends are possible starting from the first FD_WRITE message and lasting until a send returns WSAEWOULDBLOCK.
...
Рейтинг: 0 / 0
Проблема с событием FD_WRITE (асинхронные сокеты)?
    #34878643
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно я понимаю, что событие FD_WRITE нужно использовать только в том случае, когда send вернула WSAEWOULDBLOCK?
...
Рейтинг: 0 / 0
Проблема с событием FD_WRITE (асинхронные сокеты)?
    #34878692
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
OLEG_2005 wrote:
> Правильно я понимаю, что событие FD_WRITE нужно использовать только в
> том случае, когда send вернула WSAEWOULDBLOCK?

Да, правильно.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблема с событием FD_WRITE (асинхронные сокеты)?
    #34879979
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть если после sent ошибка WSAEWOULDBLOCK, то это передавать данные ещё раз по событию FD_WRITE?
...
Рейтинг: 0 / 0
Проблема с событием FD_WRITE (асинхронные сокеты)?
    #34880287
smskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что мне ответили когда-то на подобный вопрос на alt.winsock.programming

автор> Hello!
> I have a question about FD_WRITE event.

> Should it be sent after each send()? (of course if winsock is ready to
> send).
> In my case I receive FD_WRITE only once immediatly after I call
> WSAAsyncSelect() for the accepted socket though I make many send()'s
> after this.


> Thanks in advance.



You get one FD_WRITE after you connect() or after a connection is
accept()'d.

After that, you will only get an FD_WRITE if a call to send() fails with
WSAEWOULDBLOCK, and you will get only one FD_WRITE which will come only
after buffer space becomes available.


Thus, you will definitely *not* get FD_WRITE after each send().


Mike
...
Рейтинг: 0 / 0
Проблема с событием FD_WRITE (асинхронные сокеты)?
    #34880343
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
OLEG_2005 wrote:
> То есть если после sent ошибка WSAEWOULDBLOCK, то это передавать данные
> ещё раз по событию FD_WRITE?

Да, конечно. Просто нужно иметь в виду, что блок может передаться не
полностью. На следующем вызове send может вернуть ошибку EWOULDBLOCK,
если место в буфере так и не освободилось.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблема с событием FD_WRITE (асинхронные сокеты)?
    #34880422
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я передваю 100 байт и произошла и после это ошибка WSAEWOULDBLOCK, то передавать все сто байт?
...
Рейтинг: 0 / 0
Проблема с событием FD_WRITE (асинхронные сокеты)?
    #34880440
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teras
OLEG_2005 wrote:
> То есть если после sent ошибка WSAEWOULDBLOCK, то это передавать данные
> ещё раз по событию FD_WRITE?

Да, конечно. Просто нужно иметь в виду, что блок может передаться не
полностью. На следующем вызове send может вернуть ошибку EWOULDBLOCK,
если место в буфере так и не освободилось.
Posted via ActualForum NNTP Server 1.4
А можно это пояснить? Если я передаю 100 байт и произошла ошибка WSAEWOULDBLOCK, то это означает, что не передалось не одного байта, потому что буфер занят?
...
Рейтинг: 0 / 0
Проблема с событием FD_WRITE (асинхронные сокеты)?
    #34880449
smskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005Если я передваю 100 байт и произошла и после это ошибка WSAEWOULDBLOCK, то передавать все сто байт?Конечно. Если send() вернула ошибку, то значит она нисколько не передала, если бы она передала хоть сколько-то, то send() вернула бы количество переданных байт, а не код ошибки.
...
Рейтинг: 0 / 0
Проблема с событием FD_WRITE (асинхронные сокеты)?
    #34880467
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Больше спасибо.
...
Рейтинг: 0 / 0
Проблема с событием FD_WRITE (асинхронные сокеты)?
    #34880497
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
OLEG_2005 wrote:

> Если я передваю 100 байт и произошла и после это ошибка WSAEWOULDBLOCK,
> то передавать все сто байт?

Да. Если send сможет передать хоть что-нибудь он вернет признак
успешного завершения.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема с событием FD_WRITE (асинхронные сокеты)?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]