|
|
|
Проблема с событием FD_WRITE (асинхронные сокеты)?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Если можно, помогите разобраться как правильно обрабатывать событие 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"); } } Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2007, 16:05:25 |
|
||
|
Проблема с событием FD_WRITE (асинхронные сокеты)?
|
|||
|---|---|---|---|
|
#18+
Причём это событие генерируется сразу после FD_CONNECT, а затем не вырабатывается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2007, 16:09:21 |
|
||
|
Проблема с событием FD_WRITE (асинхронные сокеты)?
|
|||
|---|---|---|---|
|
#18+
Может ли кто-нибудь пояснить загадочную фразу из 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2007, 16:30:44 |
|
||
|
Проблема с событием FD_WRITE (асинхронные сокеты)?
|
|||
|---|---|---|---|
|
#18+
Правильно я понимаю, что событие FD_WRITE нужно использовать только в том случае, когда send вернула WSAEWOULDBLOCK? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2007, 16:36:37 |
|
||
|
Проблема с событием FD_WRITE (асинхронные сокеты)?
|
|||
|---|---|---|---|
|
#18+
OLEG_2005 wrote: > Правильно я понимаю, что событие FD_WRITE нужно использовать только в > том случае, когда send вернула WSAEWOULDBLOCK? Да, правильно. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2007, 16:45:05 |
|
||
|
Проблема с событием FD_WRITE (асинхронные сокеты)?
|
|||
|---|---|---|---|
|
#18+
То есть если после sent ошибка WSAEWOULDBLOCK, то это передавать данные ещё раз по событию FD_WRITE? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2007, 10:20:25 |
|
||
|
Проблема с событием FD_WRITE (асинхронные сокеты)?
|
|||
|---|---|---|---|
|
#18+
Вот что мне ответили когда-то на подобный вопрос на 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2007, 11:41:24 |
|
||
|
Проблема с событием FD_WRITE (асинхронные сокеты)?
|
|||
|---|---|---|---|
|
#18+
OLEG_2005 wrote: > То есть если после sent ошибка WSAEWOULDBLOCK, то это передавать данные > ещё раз по событию FD_WRITE? Да, конечно. Просто нужно иметь в виду, что блок может передаться не полностью. На следующем вызове send может вернуть ошибку EWOULDBLOCK, если место в буфере так и не освободилось. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2007, 11:52:31 |
|
||
|
Проблема с событием FD_WRITE (асинхронные сокеты)?
|
|||
|---|---|---|---|
|
#18+
Если я передваю 100 байт и произошла и после это ошибка WSAEWOULDBLOCK, то передавать все сто байт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2007, 12:08:36 |
|
||
|
Проблема с событием FD_WRITE (асинхронные сокеты)?
|
|||
|---|---|---|---|
|
#18+
teras OLEG_2005 wrote: > То есть если после sent ошибка WSAEWOULDBLOCK, то это передавать данные > ещё раз по событию FD_WRITE? Да, конечно. Просто нужно иметь в виду, что блок может передаться не полностью. На следующем вызове send может вернуть ошибку EWOULDBLOCK, если место в буфере так и не освободилось. Posted via ActualForum NNTP Server 1.4 А можно это пояснить? Если я передаю 100 байт и произошла ошибка WSAEWOULDBLOCK, то это означает, что не передалось не одного байта, потому что буфер занят? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2007, 12:13:09 |
|
||
|
Проблема с событием FD_WRITE (асинхронные сокеты)?
|
|||
|---|---|---|---|
|
#18+
OLEG_2005Если я передваю 100 байт и произошла и после это ошибка WSAEWOULDBLOCK, то передавать все сто байт?Конечно. Если send() вернула ошибку, то значит она нисколько не передала, если бы она передала хоть сколько-то, то send() вернула бы количество переданных байт, а не код ошибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2007, 12:14:34 |
|
||
|
Проблема с событием FD_WRITE (асинхронные сокеты)?
|
|||
|---|---|---|---|
|
#18+
Больше спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2007, 12:19:12 |
|
||
|
Проблема с событием FD_WRITE (асинхронные сокеты)?
|
|||
|---|---|---|---|
|
#18+
OLEG_2005 wrote: > Если я передваю 100 байт и произошла и после это ошибка WSAEWOULDBLOCK, > то передавать все сто байт? Да. Если send сможет передать хоть что-нибудь он вернет признак успешного завершения. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2007, 12:24:42 |
|
||
|
|

start [/forum/topic.php?fid=57&gotonew=1&tid=2027987]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
83ms |
get topic data: |
9ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 419ms |

| 0 / 0 |
