I cannot agree that this is «normal» like posted above.
In your call of recvfrom
you will receive an error in recv_len
. I recommend to check that value — it will be SOCKET_ERROR
and by calling WSAGetLastErrorenter
you will see error WSAEWOULDBLOCK
.
I am not a (Windows) socket expert, but based on my tests, I cannot use combination of ioctlsocket
and recvfrom
for receiving data via UDP in non-blocking mode (I did the same thing like you in your example).
I am planning to use combination of select
and recvfrom
with minimum possible timeout (1us). I do not know any other possibly better solution now.
Note: you should check also the return value of ioctlsocket
for possible error.
I will provide my code sample later today.
UPDATE (adding code as promised):
/* define list of sockets for function select(..) */
fd_set readfds;
/* define timeout for function select(..) */
TIMEVAL tv;
/* timeout: 1us */
tv.tv_usec = 1;
/* timeout: 0s */
tv.tv_sec = 0;
/* just 1 socket is used */
readfds.fd_count = 1;
readfds.fd_array[0] = receivingSocket;
/* determine the status of one or more sockets with timeout */
int selectReturnValue = select(0, &readfds, 0, 0, &tv);
/* check return value of the call of function select(..) */
switch (selectReturnValue)
{
/* select(..) function timeout */
case 0:
/* time limit expired */
break;
/* select(..) function error */
case SOCKET_ERROR:
/* check the error status for the last windows sockets operation */
selectError(WSAGetLastError());
break;
/* no timeout and no error */
default:
/* receive data from UDP */
resultOfrecvfrom = recvfrom(receivingSocket, receivingBuffer, sizeof(receivingBuffer), 0, (SOCKADDR *)&serverReceptionInfo, &serverReceptionInfoLength);
/* check result of call of recvfrom(..) */
switch (resultOfrecvfrom)
{
/* connection has been gracefully closed */
case 0:
/* socket was closed */
break;
/* socket error occurred during last call of socket operation */
case SOCKET_ERROR:
/* check the error status for the last Windows Sockets operation */
recvfromError(WSAGetLastError());
break;
/* resultOfrecvfrom amount of data received */
default:
/* ... add your code here */
break;
}
break;
}
I just copied crucial part of my code if more is needed, let me know in comments.
The docs say:
10035: WSAEWOULDBLOCK.
Resource temporarily unavailable.
This error is returned from operations on nonblocking sockets that cannot be completed immediately, for example recv when no data is queued to be read from the socket. It is a nonfatal error, and the operation should be retried later. It is normal for WSAEWOULDBLOCK to be reported as the result from calling connect on a nonblocking SOCK_STREAM socket, since some time must elapse for the connection to be established.
WTF???
wtf indeed
This error isn’t an error at all. Pay attention to the last phrase:
10035: WSAEWOULDBLOCK.
Resource temporarily unavailable.
This error is returned from operations on nonblocking sockets that cannot be completed immediately, for example recv when no data is queued to be read from the socket. It is a nonfatal error, and the operation should be retried later. It is normal for WSAEWOULDBLOCK to be reported as the result from calling connect on a nonblocking SOCK_STREAM socket, since some time must elapse for the connection to be established.
In a program, like that crummy msdn example, I wrote:
// Connect to server. if ( connect( g.s, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) { int err = WSAGetLastError(); printf( "Failed to connect: Error code: %d.n", err ); WSACleanup(); return; }
But what would happen EVERY TIME is 10035: WSAEWOULDBLOCK.
WHY??? I puzzled over this again and again. WHAT IS WSAEWOULDBLOCK??
codegear has:
Abstract: Whenever I try to run my socket program, I get the error WSAEWOULDBLOCK.
Question
Why do I get a WSAEWOULDBLOCK error when I run my program.
Answer
This means that you are setting up your program as a non-blocking sockets program, however the computer is telling you that it would have to create a blocked connection to the socket.
Of all the bullshit…
THAT DOESN’T ANSWER MY QUESTION!!
So, I tried putting it in a loop to see if the state would change:
// Connect to server. while ( connect( g.s, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) { int err = WSAGetLastError(); printf( "Failed to connect: Error code: %d.n", err ); //WSACleanup(); //return; }
INTERESTINGLY, this is what happens:
10035
10056
10056
10056
10056
10056
10056
10056
.
.
.
Where 10056 is:
10056: WSAEISCONN
Socket is already connected.
A connect request was made on an already-connected socket. Some implementations also return this error if sendto is called on a connected SOCK_DGRAM socket (for SOCK_STREAM sockets, the to parameter in sendto is ignored) although other implementations treat this as a legal occurrence.
WHAT???? WOOHOO . . . ? ITS CONNECTED!!! BUT WHY??
Ah. I get it. Read that red italicized text again:
10035: WSAEWOULDBLOCK.
Resource temporarily unavailable.
This error is returned from operations on nonblocking sockets that cannot be completed immediately, for example recv when no data is queued to be read from the socket. It is a nonfatal error, and the operation should be retried later. It is normal for WSAEWOULDBLOCK to be reported as the result from calling connect on a nonblocking SOCK_STREAM socket, since some time must elapse for the connection to be established.
So it would SEEM that since 10035 WSAEWOULDBLOCK is a non-fatal error, you should IGNORE IT TRY AND USE THE SOCKET ANYWAY.
If you want to use an if statement like the crummy MSDN example (which is the reason this took so long to get past!!)
// Connect to server. while ( connect( g.s, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) { int err = WSAGetLastError(); printf( "Failed to connect: Error code: %d.n", err ); printf( errCodes[ err ] ); //WSACleanup(); //return; // these errors are non-fatal: 10056 means already connected // and 10035 means its trying really hard to connect // and you should just give it a moment. if( err == 10056 || err == 10035 ) break; }
01.02.2022, 14:28. Показов 4937. Ответов 7
Делаю чат на сокетах + CLI, сервер сам сервер работает нормально, ибо он может приконектится к клиенту(созданы два других ехе консольных файла, которые работают между собой). Так вот сам сервер на CLI, спокойно работает с просто консольным клиентом, портировал сам код клиента в CLI, и получаю ошибку 10035 в сокетах. Помогите!
Код клиента на CLI:
C++ | ||
|
Код консольного клиента:
C++ | ||
|
Код консольного сервера(CLI сервер выкладывать смысла нет, ибо он работает нормально, а консольный будет более понятен для ознакомления):
C++ | ||
|
Добавлено через 3 часа 13 минут
герой найдись!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
От: | Аноним | |
Дата: | 15.01.07 18:11 | ||
Оценка: |
Привет
столкнулся с проблемой. Есть клиентская программа которая принимает данные по асинхронному сокету. На сообщение FD_READ вот такой код обработчика
void Socket::OnRead ()
{
char buf [4096];
bool ret;
do
{
ret = sock.recv (...);
if (!ret)
{
errorLogger().log (failure, sock.GetLastError());
return;
}
}while (ret);
}
в какой то момент в цикле начинает возвращаться ошибка 10035. Причем валится эта ошибка постоянно начиная с какого то момента. Почему такое? ведь если приходит сообщение FD_READ то это значит что в буфере есть данные и могут быть считаны…
подскажите почему так может происходить?
|
От: |
Poseidon |
|
Дата: | 15.01.07 18:22 | ||
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Привет
А>столкнулся с проблемой. Есть клиентская программа которая принимает данные по асинхронному сокету. На сообщение FD_READ вот такой код обработчика
А>в какой то момент в цикле начинает возвращаться ошибка 10035. Причем валится эта ошибка постоянно начиная с какого то момента. Почему такое? ведь если приходит сообщение FD_READ то это значит что в буфере есть данные и могут быть считаны…
А>подскажите почему так может происходить?
Ну в принципе так и должно быть для асинхронных сокетов. Сообщение значит что нужно подождать окончания операции чтения. Или использовать синхронные сокеты как альтернативу
Re[2]: FD_READ ошибка 10035
|
От: | Аноним | |
Дата: | 15.01.07 18:26 | ||
Оценка: |
Здравствуйте, Poseidon, Вы писали:
P>Ну в принципе так и должно быть для асинхронных сокетов. Сообщение значит что нужно подождать окончания операции чтения. Или использовать синхронные сокеты как альтернативу
да, 10035 означает что данная операция не может быть выполнена в данный момент. Но это понятно когда возвращается этот код на соединение или на запись. но вот с какого перепоя это может происходить на операции чтения??
|
От: |
SergH |
|
Дата: | 15.01.07 18:31 | ||
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>подскажите почему так может происходить?
Такое бывает. Почему — неизвестно… Проще всего перейти на синхронные сокеты + select.
Делай что должно, и будь что будет
|
От: |
Michael Chelnokov |
|
Дата: | 15.01.07 18:43 | ||
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>
А> ret = sock.recv (...);
А> if (!ret)
А>
Какого класса обьект sock?
(иначе говоря, что вообще возвращает его recv?)
|
От: |
ilnar |
|
Дата: | 16.01.07 06:48 | ||
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Привет
А>столкнулся с проблемой. Есть клиентская программа которая принимает данные по асинхронному сокету. На сообщение FD_READ вот такой код обработчика
А>в какой то момент в цикле начинает возвращаться ошибка 10035. Причем валится эта ошибка постоянно начиная с какого то момента. Почему такое? ведь если приходит сообщение FD_READ то это значит что в буфере есть данные и могут быть считаны…
А>подскажите почему так может происходить?
после FD_READ гарантируется только одно чтение, очередные после следующего FD_READ или до ошибки
|
От: | Аноним | |
Дата: | 16.01.07 08:21 | ||
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Привет
А>столкнулся с проблемой. Есть клиентская программа которая принимает данные по асинхронному сокету. На сообщение FD_READ вот такой код обработчика
А>
А>void Socket::OnRead ()
А>{
А> char buf [4096];
А> bool ret;
А> do
А> {
А> ret = sock.recv (...);
А> if (!ret)
А> {
А> errorLogger().log (failure, sock.GetLastError());
А> return;
А> }
А> }while (ret);
А>}
А>
А>в какой то момент в цикле начинает возвращаться ошибка 10035. Причем валится эта ошибка постоянно начиная с какого то момента. Почему такое? ведь если приходит сообщение FD_READ то это значит что в буфере есть данные и могут быть считаны…
А>подскажите почему так может происходить?
А собственно… да, что такое класс объекта sock ?
Обычный апишный recv возвращает размер скопированных в буфер данных
If no error occurs, recv returns the number of bytes received.
If the connection has been gracefully closed, the return value is zero
А ошибку можно считывать если вернулся SOCKET_ERROR
Может просто пришел EOF ? Тогда нужно перестать читать.
Re[2]: FD_READ ошибка 10035
|
От: | Аноним | |
Дата: | 16.01.07 08:32 | ||
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>А собственно… да, что такое класс объекта sock ?
А>Обычный апишный recv возвращает размер скопированных в буфер данных
А>If no error occurs, recv returns the number of bytes received.
А>If the connection has been gracefully closed, the return value is zero
А>А ошибку можно считывать если вернулся SOCKET_ERROR
А>Может просто пришел EOF ? Тогда нужно перестать читать.
Пардон, там просто recv, стандартный Winsock вызов. Класс Socket это обертка над Winsock.
При вызове recv возвращается что считано ноль байт и результат ret равен нулю. Вот именно поэтому странно что когда я пытаюсь найти ошибку мне выдается 10035.
В этот момент принимается просто поток байтов, это голосовые данные сжатые кодеком.
Насколько я правильно понял то на каждое сообщение FD_READ нужно считывать данные только один раз? нельзя иметь цикл чтобы считать все данные которые нужно принять?
Re[3]: FD_READ ошибка 10035
|
От: | Аноним | |
Дата: | 16.01.07 08:49 | ||
Оценка: |
А>При вызове recv возвращается что считано ноль байт и результат ret равен нулю. Вот именно поэтому странно что когда я пытаюсь найти ошибку мне выдается 10035.
Так это, ошибки-то не было, он же не вернул SOCKET_ERROR.
Вот и нечего её искать.
Re[4]: FD_READ ошибка 10035
|
От: | Аноним | |
Дата: | 16.01.07 11:00 | ||
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>>При вызове recv возвращается что считано ноль байт и результат ret равен нулю. Вот именно поэтому странно что когда я пытаюсь найти ошибку мне выдается 10035.
А>Так это, ошибки-то не было, он же не вернул SOCKET_ERROR.
А>Вот и нечего её искать.
то есть Вы хотите сказать что сокет был закрыт в какой то момент и после этого произошло опять считывание?
Re[5]: FD_READ ошибка 10035
|
От: |
NeuroVirus |
|
Дата: | 16.01.07 11:19 | ||
Оценка: |
|
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>>При вызове recv возвращается что считано ноль байт и результат ret равен нулю. Вот именно поэтому странно что когда я пытаюсь найти ошибку мне выдается 10035.
А>>Так это, ошибки-то не было, он же не вернул SOCKET_ERROR.
А>>Вот и нечего её искать.
А>то есть Вы хотите сказать что сокет был закрыт в какой то момент и после этого произошло опять считывание?
Блин! Вторая сторона закрыла соединение/передачу и пришел EOF, который на этой стороне приходит как данные длиной ноль. точка. все. как пришел ноль данных — перестань читать. это сигнал такой. ноль данных — значить все, передача завершена от абонента. То-есть не обязательно совсем closesocket(), может быть просто shutdown(SB_SEND) а ты ему чего-то еще передать можешь и он это даже прочтет, но получать уже ты ничего не будешь. Это не ошибка вовсе. Ошибка это SOCKET_ERROR (== -1) а ноль это не ошибка, это просто данные, но данных — ноль, и читать больше не нужно. Можно писать, а читать — нет. Как принял ноль — так все — читать больше не надо, но это не ошибка, это нормально. И это нормально называется EOF — ноль данных.
Re[6]: FD_READ ошибка 10035
|
От: | Аноним | |
Дата: | 16.01.07 12:58 | ||
Оценка: |
Здравствуйте, NeuroVirus, Вы писали:
NV>Блин! Вторая сторона закрыла соединение/передачу и пришел EOF, который на этой стороне приходит как данные длиной ноль. точка. все. как пришел ноль данных — перестань читать. это сигнал такой. ноль данных — значить все, передача завершена от абонента. То-есть не обязательно совсем closesocket(), может быть просто shutdown(SB_SEND) а ты ему чего-то еще передать можешь и он это даже прочтет, но получать уже ты ничего не будешь. Это не ошибка вовсе. Ошибка это SOCKET_ERROR (== -1) а ноль это не ошибка, это просто данные, но данных — ноль, и читать больше не нужно. Можно писать, а читать — нет. Как принял ноль — так все — читать больше не надо, но это не ошибка, это нормально. И это нормально называется EOF — ноль данных.
Это замечательно, но почему тогда этот ноль приходит постоянно? Точнее постоянно приходит FD_READ сообщение и обработчик этого сообщения считавыает ноль данных? Еще раз код:
HRESULT MainDlg::WindowProc (...)
{
case FD_READ:
socket().OnRead ();
break;
}
Если обнаруживается FD_READ то начните чтение
void Socket::OnRead ()
{
char buf [4096];
bool ret;
do
{
ret = recv (...);
if (!ret)
{
errorLogger().log (failure, GetLastError());
return;
}
............
} while (ret);
}
как только приходит FD_READ я в цикле начинаю считывать как можно больше. Если читать больше нечего (это необязательно может быть закрытие соединения, это может быть просто что данных больше нет, передача прекратилась) то я выхожу из цикла.
Еще.. идет вещание голоса, клиент принмает данные и слышит их.. в какой то момент голос обрывается.. я смотрю в лог и вижу что клиент начинает читать данные размером ноль и возвращается ошибка 10035.. вопрос, почему если соединение/ чтение закрыто то продолжаются поститься сообщения FD_READ? почему клиент продолжает считывать данные..
Re[7]: FD_READ ошибка 10035
|
От: | Аноним | |
Дата: | 16.01.07 13:11 | ||
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, NeuroVirus, Вы писали:
NV>>Блин! Вторая сторона закрыла соединение/передачу и пришел EOF, который на этой стороне приходит как данные длиной ноль. точка. все. как пришел ноль данных — перестань читать. это сигнал такой. ноль данных — значить все, передача завершена от абонента. То-есть не обязательно совсем closesocket(), может быть просто shutdown(SB_SEND) а ты ему чего-то еще передать можешь и он это даже прочтет, но получать уже ты ничего не будешь. Это не ошибка вовсе. Ошибка это SOCKET_ERROR (== -1) а ноль это не ошибка, это просто данные, но данных — ноль, и читать больше не нужно. Можно писать, а читать — нет. Как принял ноль — так все — читать больше не надо, но это не ошибка, это нормально. И это нормально называется EOF — ноль данных.
А>Это замечательно, но почему тогда этот ноль приходит постоянно? Точнее постоянно приходит FD_READ сообщение и обработчик этого сообщения считавыает ноль данных? Еще раз код:
recv() — это функция со свойством reenabling (МСДН-МСДН-МСДН!)
т.е. по событию FD_READ нужно прочитать один раз в буфер, если данных больше 0 то обработать то что есть, если есть еще данные — событие FD_READ придет еще раз; если-же recv() вернул ноль — это EOF (сегмент FIN от той стороны). Читать в цикле в одном обработчике события FD_READ не надо.
Почему все время приходет ноль — это помоему какойто нюанс в вашей реализации
Re[7]: FD_READ ошибка 10035
|
От: | Аноним | |
Дата: | 17.01.07 09:18 | ||
Оценка: |
А>
А>void Socket::OnRead ()
А>{
А> char buf [4096];
А> bool ret;
А> do
А> {
А> ret = recv (...);
А> if (!ret)
А> {
А> errorLogger().log (failure, GetLastError());
А> return;
А> }
А> ............
А> } while (ret);
А>}
А>
Хмм. А ошибки (которые ret=-1) как обрабатываются?
Когда получаешь EWOULDBLOCK просто заканчиваешь читать из сокета и ждешь следующего события о приходе данных.
Кстати, клиент случаем данные размером в 0 байт не посылает?
Re[8]: FD_READ ошибка 10035
|
От: |
NeuroVirus |
|
Дата: | 17.01.07 09:34 | ||
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>>
А>>void Socket::OnRead ()
А>>{
А>> char buf [4096];
А>> bool ret;
А>> do
А>> {
А>> ret = recv (...);
А>> if (!ret)
А>> {
А>> errorLogger().log (failure, GetLastError());
А>> return;
А>> }
А>> ............
А>> } while (ret);
А>>}
А>>
А>Хмм. А ошибки (которые ret=-1) как обрабатываются?
А>Когда получаешь EWOULDBLOCK просто заканчиваешь читать из сокета и ждешь следующего события о приходе данных.
А>Кстати, клиент случаем данные размером в 0 байт не посылает?
Клиент посылает данные размером в ноль только когда завершает передачу (closesocket или shutdown(s, SD_SEND)
т.е. стек посылает FIN и получающая сторона получает данные размером ноль.
EWOULDBLOCK получить при чтении можно только в неблокирующих сокетах,
нужно ждать событие FD_READ и читать данные только тогда,
еще раз: получаешь FD_READ — читаешь один раз, добавляешь ко входному буферу,
если данных достаточно — обрабатываешь, недостаточно — ждешь дальше FD_READ.
если получить EWOULDBLOCK при записи нужно ждать FD_WRITE и только после этого продолжать запись,
так-же получаешь FD_WRITE сразу после успешного коннекта, т.е. на любое событие FD_WRITE
смотришь выходной буфер, если есть что отправлять — отправляешь пока не получишь EWOULDBLOCK,
как только получил EWOULDBLOCK перестаешь отправлять и ждешь FD_WRITE
Re[9]: FD_READ ошибка 10035
|
От: | Аноним | |
Дата: | 17.01.07 10:43 | ||
Оценка: |
А>>>
А>>>void Socket::OnRead ()
А>>>{
А>>> char buf [4096];
А>>> bool ret;
А>>> do
А>>> {
А>>> ret = recv (...);
А>>> if (!ret)
А>>> {
А>>> errorLogger().log (failure, GetLastError());
А>>> return;
А>>> }
А>>> ............
А>>> } while (ret);
А>>>}
А>>>
А>>Хмм. А ошибки (которые ret=-1) как обрабатываются?
А>>Когда получаешь EWOULDBLOCK просто заканчиваешь читать из сокета и ждешь следующего события о приходе данных.
А>>Кстати, клиент случаем данные размером в 0 байт не посылает?
NV>Клиент посылает данные размером в ноль только когда завершает передачу (closesocket или shutdown(s, SD_SEND)
NV>т.е. стек посылает FIN и получающая сторона получает данные размером ноль.
Т.е. на клиентской стороне сказать send(&buff, 0) нельзя?
NV>EWOULDBLOCK получить при чтении можно только в неблокирующих сокетах,
NV>нужно ждать событие FD_READ и читать данные только тогда,
NV>еще раз: получаешь FD_READ — читаешь один раз, добавляешь ко входному буферу,
NV>если данных достаточно — обрабатываешь, недостаточно — ждешь дальше FD_READ.
А почему нельзя читать данные до тех пор, пока не получил EWOULDBLOCK?
Вопрос об обработке ошибок остался не раскрытым, но он и не к Вам был.
Re[10]: FD_READ ошибка 10035
|
От: |
NeuroVirus |
|
Дата: | 17.01.07 10:47 | ||
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Т.е. на клиентской стороне сказать send(&buff, 0) нельзя?
можно, но далеко это не пойдет
NV>>EWOULDBLOCK получить при чтении можно только в неблокирующих сокетах,
NV>>нужно ждать событие FD_READ и читать данные только тогда,
NV>>еще раз: получаешь FD_READ — читаешь один раз, добавляешь ко входному буферу,
NV>>если данных достаточно — обрабатываешь, недостаточно — ждешь дальше FD_READ.
А>А почему нельзя читать данные до тех пор, пока не получил EWOULDBLOCK?
пока не получишь следующий FD_READ
если при чтении остались данные, то сразу снова получишь FD_READ
(блин, ну я зря чтоли писал про реенэйблинг и вообще не грех МСДН почитать)
А>Вопрос об обработке ошибок остался не раскрытым, но он и не к Вам был.
а вопрос по обработке ошибок — закрываешь сокет и ругаешься громко с кодом ошибки, тут чего непонятно?
Re[9]: FD_READ ошибка 10035
|
От: | Аноним | |
Дата: | 17.01.07 11:03 | ||
Оценка: |
Здравствуйте, NeuroVirus, Вы писали:
NV>EWOULDBLOCK получить при чтении можно только в неблокирующих сокетах,
NV>нужно ждать событие FD_READ и читать данные только тогда,
NV>еще раз: получаешь FD_READ — читаешь один раз, добавляешь ко входному буферу,
NV>если данных достаточно — обрабатываешь, недостаточно — ждешь дальше FD_READ.
NV>если получить EWOULDBLOCK при записи нужно ждать FD_WRITE и только после этого продолжать запись,
NV>так-же получаешь FD_WRITE сразу после успешного коннекта, т.е. на любое событие FD_WRITE
NV>смотришь выходной буфер, если есть что отправлять — отправляешь пока не получишь EWOULDBLOCK,
NV>как только получил EWOULDBLOCK перестаешь отправлять и ждешь FD_WRITE
Про reenabling функции я в курсе. Объясните популярно почему на одно сообщение FD_READ нельзя читать в цикле?
следующий вопрос. Вот допустим приходит пакет размером 150 байт, я в цикле считываю его, после чего в буфере ТСР ничего нет. Потом в цикле идет второе считывание и возвращается ноль байт потому что считывать больше нечего. Но ведь этот ноль байт не от того, что сервер закрыл соединение, а потому что больше нечего считывать так ведь?
Re[11]: FD_READ ошибка 10035
|
От: | Аноним | |
Дата: | 17.01.07 11:04 | ||
Оценка: |
NV>а вопрос по обработке ошибок — закрываешь сокет и ругаешься громко с кодом ошибки, тут чего непонятно?
Непонятно где она, эта обработка, в исходном коде.
Re[10]: FD_READ ошибка 10035
|
От: | Аноним | |
Дата: | 17.01.07 11:12 | ||
Оценка: |
А>следующий вопрос. Вот допустим приходит пакет размером 150 байт, я в цикле считываю его, после чего в буфере ТСР ничего нет. Потом в цикле идет второе считывание и возвращается ноль байт потому что считывать больше нечего. Но ведь этот ноль байт не от того, что сервер закрыл соединение, а потому что больше нечего считывать так ведь?
Если нет данных, то recv() вернет -1 и ошибка будет EWOULDBLOCK.
0 вернется только в случае «корректного» завершения соединения.
Вот собственно обработки ошибок здесь я и не вижу. Только проверка на корректность закрытия соединения.
do
{
ret = recv (...);
if (!ret)
{
errorLogger().log (failure, GetLastError());
return;
}
............
} while (ret);
- Переместить
- Удалить
- Выделить ветку
Пока на собственное сообщение не было ответов, его можно удалить.
При работе с сокетами бывают исключительные ситуации, при которых возникают ошибки с некими кодами. Немножко поискав — нашел описание ошибок. Решил привести данное описание в своем блоге:
Socket error 10004 — Interrupted function call
Socket error 10013 — Permission denied
Socket error 10014 — Bad address
Socket error 10022 — Invalid argument
Socket error 10024 — Too many open files
Socket error 10035 — Resource temporarily unavailable
Socket error 10036 — Operation now in progress
Socket error 10037 — Operation already in progress
Socket error 10038 — Socket operation on non-socket
Socket error 10039 — Destination address required
Socket error 10040 — Message too long
Socket error 10041 — Protocol wrong type for socket
Socket error 10042 — Bad protocol option
Socket error 10043 — Protocol not supported
Socket error 10044 — Socket type not supported
Socket error 10045 — Operation not supported
Socket error 10046 — Protocol family not supported
Socket error 10047 — Address family not supported by protocol family
Socket error 10048 — Address already in use
Socket error 10049 — Cannot assign requested address
Socket error 10050 — Network is down
Socket error 10051 — Network is unreachable
Socket error 10052 — Network dropped connection on reset
Socket error 10053 — Software caused connection abort
Socket error 10054 — Connection reset by peer
Socket error 10055 — No buffer space available
Socket error 10056 — Socket is already connected
Socket error 10057 — Socket is not connected
Socket error 10058 — Cannot send after socket shutdown
Socket error 10060 — Connection timed out
Socket error 10061 — Connection refused
Socket error 10064 — Host is down
Socket error 10065 — No route to host
Socket error 10067 — Too many processes
Socket error 10091 — Network subsystem is unavailable
Socket error 10092 — WINSOCK.DLL version out of range
Socket error 10093 — Successful WSAStartup not yet performed
Socket error 10094 — Graceful shutdown in progress
Socket error 11001 — Host not found
Socket error 11002 — Non-authoritative host not found
Socket error 11003 — This is a non-recoverable error
Socket error 11004 — Valid name, no data record of requested type
-
Mar 2nd, 2009, 07:12 AM
#1
Thread Starter
Hyperactive Member
[RESOLVED] [winsock] error 10035
-
Mar 2nd, 2009, 07:26 AM
#2
Member
Re: [winsock] error 10035
Are you under Windows Vista? I seem to encounter this problem when I was running Vista and VB was unable to bind to a local port.
-
Mar 2nd, 2009, 08:09 AM
#3
Thread Starter
Hyperactive Member
Re: [winsock] error 10035
i am using windows 7 actually
-
Mar 2nd, 2009, 11:56 AM
#4
Re: [winsock] error 10035
Error 10035:
Problem: Resource temporarily unavailable.
Solution: This is a temporary condition and later calls to the same routine may complete normally. The socket is marked as non-blocking (non-blocking operation mode), and the requested operation is not complete at this time.
Since it occurs on the server side only you have no way of knowing this on the client side so I do not know how you could repeat the call.
Are you absolutely sure there is no client side evidence of this occurance? Do you have a Winsock_Error event on the client(s) applications to trap errors when they occur?
Last edited by jmsrickland; Mar 2nd, 2009 at 12:01 PM.
-
Mar 2nd, 2009, 12:08 PM
#5
Thread Starter
Hyperactive Member
Re: [winsock] error 10035
Originally Posted by jmsrickland
Error 10035:
Problem: Resource temporarily unavailable.
Solution: This is a temporary condition and later calls to the same routine may complete normally. The socket is marked as non-blocking (non-blocking operation mode), and the requested operation is not complete at this time.
Since it occurs on the server side only you have no way of knowing this on the client side so I do not know how you could repeat the call.
Are you absolutely sure there is no client side evidence of this occurance? Do you have a Winsock_Error event on the client(s) applications to trap errors when they occur?
yes i am 100% sure there is nothing happening on the client side.. but on server side it accepts the connection and then moves on to server_error event.. i have just installed sp6 on my machine.. since then i am not having any problem.. i will give it a day ..if everything works fine i shall mark this thread resolved.. for even i did google around about this error.. everyone were facing problems like mine but there was no solution .. anywayz thank you jmsrickland u are always there to help ..
-
Mar 2nd, 2009, 12:58 PM
#6
Thread Starter
Hyperactive Member
Re: [winsock] error 10035
the problem still exists.. after a successful connection why does the server throw an error number 10035?
-
Mar 2nd, 2009, 01:55 PM
#7
Re: [winsock] error 10035
OK, I will ask you again. Do you have a Winsock_Error(Index) event in your client application and are you checking for any and all errors? If an error occurs at the server side an error should also occur at the client side.
-
Mar 2nd, 2009, 10:12 PM
#8
Thread Starter
Hyperactive Member
Re: [winsock] error 10035
Originally Posted by jmsrickland
OK, I will ask you again. Do you have a Winsock_Error(Index) event in your client application and are you checking for any and all errors? If an error occurs at the server side an error should also occur at the client side.
no nothing happens on the client side.. if i don’t add the sub «winsock_error()» on the server side..then it works fine.. what i mean is ..even with the error the connection is still there and works most of the time… i rechecked and rechecked my codes and i found out that although different socks from the client are being connected to different socks in the server .. the data arrival event is handled by the same socks for different client.. is this an issue ??
-
Mar 2nd, 2009, 10:40 PM
#9
Re: [winsock] error 10035
the data arrival event is handled by the same socks for different client.. is this an issue ??
Yes! Different clients must have different sockets on the server side
-
Mar 2nd, 2009, 11:55 PM
#10
Re: [winsock] error 10035
This error usually occurs in programs that do not drive output using the SendComplete event. If you call SendData a subsequent time without waiting for SendComplete on the previous send you can get this error if there is no room in the underlying socket’s send buffer.
Getting the error on Accept seems very odd, but it seems to be possible… hmm, are you sure you don’t SendData right away? I’ve never seen this.
-
Mar 3rd, 2009, 05:28 AM
#11
Thread Starter
Hyperactive Member
Re: [winsock] error 10035
phew! i finally got it working.. i can connect more than 3000 sockets from the client side to the server which in turn will use the same amount of sockets..
no problem while connecting ..or sending messages..how over i have one issue.. i don’t know if its normal or my codes.. as the socks on the client side send data the data arrival in the server is fired only after all the socks in the client side sends the data.. it would be better if the data are process as it is being sent.. i am uploading my project perhaps one of you could take a look if you are free.. thank you..Last edited by pannam; Mar 4th, 2009 at 07:33 PM.
-
Mar 4th, 2009, 07:42 PM
#12
Thread Starter
Hyperactive Member
Re: [winsock] error 10035
now, all’s working fine.. i made some adjustments. and its all done.. now.. the transactions take simultaneously ..for those who want multi connection [maximum connection]on multiple server ..this might come handy.. i am uploading the project..