Ошибка 10035 sap

Правила форума

ВНИМАНИЕ! Прежде чем задавать вопрос, ознакомьтесь со ссылками ниже:

Вопросы по отличиям версий SAP, Add-On, EHP — сюда
Вопросы по SAP Front End (SAPlogon, SAPgui, guiXT и т.д.) — сюда
Вопросы по LSMW — сюда
Вопросы по архивации в SAP — сюда
Вопросы по SAP GRC — сюда
Вопросы по SAP Business Workplace (почте SAP) и SAP Office — сюда
Вопросы по miniSAP (SAP mini basis) — сюда
Вопросы по SAP HANA — сюда
Вопросы по лицензированию продуктов SAP — сюда

Автор Сообщение

Заголовок сообщения: Нет подключения к saprouter

СообщениеДобавлено: Вс, дек 21 2014, 16:34 

Начинающий
Начинающий



Зарегистрирован:
Чт, янв 16 2014, 10:41
Сообщения: 14

Пытаюсь зайти в SAP систему. Выдается ошибка partner …:3299 not reached (Err no 10035, Err txt WSAEWOULDBLOCK: Resource temporarily unavailable)
Проверяю IP SAPроутера — ping есть, trace проходит. telnet на порт 3299 выдает Connection timed out
Но, точно знаю что saprouter рабочий, так как в 1 одном случае из 4х коннект происходит:
2 разных роутера на работе, 1 роутер dlink dir320, 1 телефон в режиме модема.
Работает с 1 роутером на работе.

Пометить тему как нерешенную

Вернуться к началу

Профиль Отправить email  

шрам

Заголовок сообщения: Re: Нет подключения к saprouter

СообщениеДобавлено: Вс, дек 21 2014, 16:38 



Зарегистрирован:
Чт, сен 28 2006, 11:36
Сообщения: 1365
Откуда: Москва
Пол: Мужской

Вы хвалитесь или жалуетесь?

Пометить тему как нерешенную

Вернуться к началу

Профиль  

nrv

Заголовок сообщения: Re: Нет подключения к saprouter

СообщениеДобавлено: Пн, дек 22 2014, 13:47 

Начинающий
Начинающий



Зарегистрирован:
Чт, янв 16 2014, 10:41
Сообщения: 14

Вопрос — на что нужно посмотреть, чтобы выявить причину такого поведения.

Пометить тему как нерешенную

Вернуться к началу

Профиль Отправить email  

basiscons

Заголовок сообщения: Re: Нет подключения к saprouter

СообщениеДобавлено: Пн, дек 22 2014, 14:12 

Специалист
Специалист



Зарегистрирован:
Вт, июл 19 2011, 23:16
Сообщения: 130

на сеть, например. не стоит ли где на пути к 3299 порту сетевой фильтр, более известный как файрвол.

Пометить тему как нерешенную

Вернуться к началу

Профиль  

nrv

Заголовок сообщения: Re: Нет подключения к saprouter

СообщениеДобавлено: Пн, дек 22 2014, 16:01 

Начинающий
Начинающий



Зарегистрирован:
Чт, янв 16 2014, 10:41
Сообщения: 14

как можно определить наличие фильтра? в случае сотовый телефон в режиме модема — файрвола нет, провайдер сотовой связи может блокировать порт?
или режим модема не все порты открывает?

Пометить тему как нерешенную

Вернуться к началу

Профиль Отправить email  

RikoNw

Заголовок сообщения: Re: Нет подключения к saprouter

СообщениеДобавлено: Пн, дек 22 2014, 17:16 



Зарегистрирован:
Пн, янв 14 2013, 10:37
Сообщения: 795
Пол: Мужской

80% проблем людей — проблемы понимания при общении. у вас там какие-то роутеры, вы через них как-то ходите, а потом через телефон ходите. то ли роутеры во вне смотрят, то ли телефон к местной wi-fi, то ли еще чего. Опишите обстановку точнее.

Пометить тему как нерешенную

Вернуться к началу

Профиль Отправить email  

nrv

Заголовок сообщения: Re: Нет подключения к saprouter

СообщениеДобавлено: Пн, дек 22 2014, 18:31 

Начинающий
Начинающий



Зарегистрирован:
Чт, янв 16 2014, 10:41
Сообщения: 14

Ok. Есть saprouter для подключения к sap системе. У него публичный ip. Этот ip доступен при проверке утилитами ping, tracert. Я пытаюсь подключиться к нему с помощью sapgui. Не подключается. Варианты — закрыты порты на роутере. Либо фильтруется провайдером. Вот и возник вопрос, каким образом можно найти что блокирует доступ? А в первом посте я написал о том, что подключение работает в одном из четырех разных выходах в интернет.

Пометить тему как нерешенную

Вернуться к началу

Профиль Отправить email  

nrv

Заголовок сообщения: Re: Нет подключения к saprouter  Тема решена

СообщениеДобавлено: Пн, дек 22 2014, 20:31 

Начинающий
Начинающий



Зарегистрирован:
Чт, янв 16 2014, 10:41
Сообщения: 14

вопрос закрыт. Прошу прощения, но все заработало само собой.

Пометить тему как нерешенную

Вернуться к началу

Профиль Отправить email  

SAPDHI:sapdp00 not reached and WSAEWOULDBLOCK : Resource Temporarily unavailable

I have installed a SAP ERP 6.0 on SUSE with Maxdb. The installation was concluded with successful. I have started SAP instance with the command startsap all and I could see that the Instance is look like working. 

From a workstation, I am getting to ping the server but when I try to use SAP GUI, I am getting an error saying : 

«SAPDHI:sapdp00» not reached 

Component : NI (Network Interface) 

Module : nibuf.cpp 

Line 4658 

Method NiBuf!ConnetÇ connection pending after 10000ms 

Return code : -10 

Error No : 10035 

Error Text : WSAEWOULDBLOCK : Resource Temporarily unavailable 

To check if the system is working I have executed the following command ps -ef | grep dw.sap  and the result was : 

SAPDHI:/ # ps -ef | grep dw.sap 
dhiadm 27676 27631 0 21:56 ? 00:00:02 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28023 27676 0 21:56 ? 00:00:02 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28026 27676 0 21:56 ? 00:00:00 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28030 27676 0 21:56 ? 00:00:01 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28036 27676 0 21:56 ? 00:00:00 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28039 27676 0 21:56 ? 00:00:01 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28080 27676 0 21:56 ? 00:00:00 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28081 27676 0 21:56 ? 00:00:01 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28083 27676 0 21:56 ? 00:00:04 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28086 27676 0 21:56 ? 00:00:01 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28087 27676 0 21:56 ? 00:00:05 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28093 27676 0 21:56 ? 00:00:00 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28103 27676 0 21:56 ? 00:00:00 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28109 27676 0 21:56 ? 00:00:00 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28110 27676 0 21:56 ? 00:00:00 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28117 27676 0 21:56 ? 00:00:01 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28120 27676 0 21:56 ? 00:00:00 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
root 29089 5024 0 22:26 pts/0 00:00:00 grep dw.sap 
SAPDHI:/ # 

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;
  }

Правила форума

ВНИМАНИЕ! Прежде чем задавать вопрос, ознакомьтесь со ссылками ниже:

Вопросы по отличиям версий SAP, Add-On, EHP — сюда
Вопросы по SAP Front End (SAPlogon, SAPgui, guiXT и т.д.) — сюда
Вопросы по LSMW — сюда
Вопросы по архивации в SAP — сюда
Вопросы по SAP GRC — сюда
Вопросы по SAP Business Workplace (почте SAP) и SAP Office — сюда
Вопросы по miniSAP (SAP mini basis) — сюда
Вопросы по SAP HANA — сюда
Вопросы по лицензированию продуктов SAP — сюда

Автор Сообщение

Заголовок сообщения: Нет подключения к saprouter

СообщениеДобавлено: Вс, дек 21 2014, 16:34 

Начинающий
Начинающий

Зарегистрирован:
Чт, янв 16 2014, 10:41
Сообщения: 14

Пытаюсь зайти в SAP систему. Выдается ошибка partner …:3299 not reached (Err no 10035, Err txt WSAEWOULDBLOCK: Resource temporarily unavailable)
Проверяю IP SAPроутера — ping есть, trace проходит. telnet на порт 3299 выдает Connection timed out
Но, точно знаю что saprouter рабочий, так как в 1 одном случае из 4х коннект происходит:
2 разных роутера на работе, 1 роутер dlink dir320, 1 телефон в режиме модема.
Работает с 1 роутером на работе.

Пометить тему как нерешенную

Вернуться к началу

Профиль Отправить email  

шрам

Заголовок сообщения: Re: Нет подключения к saprouter

СообщениеДобавлено: Вс, дек 21 2014, 16:38 

Зарегистрирован:
Чт, сен 28 2006, 11:36
Сообщения: 1365
Откуда: Москва
Пол: Мужской

Вы хвалитесь или жалуетесь?

Пометить тему как нерешенную

Вернуться к началу

Профиль  

nrv

Заголовок сообщения: Re: Нет подключения к saprouter

СообщениеДобавлено: Пн, дек 22 2014, 13:47 

Начинающий
Начинающий

Зарегистрирован:
Чт, янв 16 2014, 10:41
Сообщения: 14

Вопрос — на что нужно посмотреть, чтобы выявить причину такого поведения.

Пометить тему как нерешенную

Вернуться к началу

Профиль Отправить email  

basiscons

Заголовок сообщения: Re: Нет подключения к saprouter

СообщениеДобавлено: Пн, дек 22 2014, 14:12 

Специалист
Специалист

Зарегистрирован:
Вт, июл 19 2011, 23:16
Сообщения: 130

на сеть, например. не стоит ли где на пути к 3299 порту сетевой фильтр, более известный как файрвол.

Пометить тему как нерешенную

Вернуться к началу

Профиль  

nrv

Заголовок сообщения: Re: Нет подключения к saprouter

СообщениеДобавлено: Пн, дек 22 2014, 16:01 

Начинающий
Начинающий

Зарегистрирован:
Чт, янв 16 2014, 10:41
Сообщения: 14

как можно определить наличие фильтра? в случае сотовый телефон в режиме модема — файрвола нет, провайдер сотовой связи может блокировать порт?
или режим модема не все порты открывает?

Пометить тему как нерешенную

Вернуться к началу

Профиль Отправить email  

RikoNw

Заголовок сообщения: Re: Нет подключения к saprouter

СообщениеДобавлено: Пн, дек 22 2014, 17:16 

Зарегистрирован:
Пн, янв 14 2013, 10:37
Сообщения: 795
Пол: Мужской

80% проблем людей — проблемы понимания при общении. у вас там какие-то роутеры, вы через них как-то ходите, а потом через телефон ходите. то ли роутеры во вне смотрят, то ли телефон к местной wi-fi, то ли еще чего. Опишите обстановку точнее.

Пометить тему как нерешенную

Вернуться к началу

Профиль Отправить email  

nrv

Заголовок сообщения: Re: Нет подключения к saprouter

СообщениеДобавлено: Пн, дек 22 2014, 18:31 

Начинающий
Начинающий

Зарегистрирован:
Чт, янв 16 2014, 10:41
Сообщения: 14

Ok. Есть saprouter для подключения к sap системе. У него публичный ip. Этот ip доступен при проверке утилитами ping, tracert. Я пытаюсь подключиться к нему с помощью sapgui. Не подключается. Варианты — закрыты порты на роутере. Либо фильтруется провайдером. Вот и возник вопрос, каким образом можно найти что блокирует доступ? А в первом посте я написал о том, что подключение работает в одном из четырех разных выходах в интернет.

Пометить тему как нерешенную

Вернуться к началу

Профиль Отправить email  

nrv

Заголовок сообщения: Re: Нет подключения к saprouter  Тема решена

СообщениеДобавлено: Пн, дек 22 2014, 20:31 

Начинающий
Начинающий

Зарегистрирован:
Чт, янв 16 2014, 10:41
Сообщения: 14

вопрос закрыт. Прошу прощения, но все заработало само собой.

Пометить тему как нерешенную

Вернуться к началу

Профиль Отправить email  

SAP on single Windows Server.

For Me through VPN:

  1. I can ping both the IP address and domain.
  2. I can connect to SAPGUI.
  3. When I telnet to IP Port 3200, get a black screen.
  4. «netstat -a» is slow, but executes, but «netstat -an» is instantaneous.

My developer through VPN:

  1. Can ping both IP and domain, but can’t connect through SAPGUI from two different machines.
  2. Have tested with all firewalls (server and client) off — doesn’t work.

Hosts file on server correctly has entry for domain. Services file has entry for sapdp00:3200 .

Reviewed both 124562 Hostname resolution problems (DNS timeouts) and 23538 Problems due to inconsistent host name notation but don’t know that I’ve got a good answer.

I’m not a network guy (or really Basis). Hoping someone can give me some pointers of what to look for.

Thanks in advance.

SAP on single Windows Server.

For Me through VPN:

  1. I can ping both the IP address and domain.
  2. I can connect to SAPGUI.
  3. When I telnet to IP Port 3200, get a black screen.
  4. «netstat -a» is slow, but executes, but «netstat -an» is instantaneous.

My developer through VPN:

  1. Can ping both IP and domain, but can’t connect through SAPGUI from two different machines.
  2. Have tested with all firewalls (server and client) off — doesn’t work.

Hosts file on server correctly has entry for domain. Services file has entry for sapdp00:3200 .

Reviewed both 124562 Hostname resolution problems (DNS timeouts) and 23538 Problems due to inconsistent host name notation but don’t know that I’ve got a good answer.

I’m not a network guy (or really Basis). Hoping someone can give me some pointers of what to look for.

Thanks in advance.

SAPDHI:sapdp00 not reached and WSAEWOULDBLOCK : Resource Temporarily unavailable

I have installed a SAP ERP 6.0 on SUSE with Maxdb. The installation was concluded with successful. I have started SAP instance with the command startsap all and I could see that the Instance is look like working. 

From a workstation, I am getting to ping the server but when I try to use SAP GUI, I am getting an error saying : 

«SAPDHI:sapdp00» not reached 

Component : NI (Network Interface) 

Module : nibuf.cpp 

Line 4658 

Method NiBuf!ConnetÇ connection pending after 10000ms 

Return code : -10 

Error No : 10035 

Error Text : WSAEWOULDBLOCK : Resource Temporarily unavailable 

To check if the system is working I have executed the following command ps -ef | grep dw.sap  and the result was : 

SAPDHI:/ # ps -ef | grep dw.sap 
dhiadm 27676 27631 0 21:56 ? 00:00:02 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28023 27676 0 21:56 ? 00:00:02 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28026 27676 0 21:56 ? 00:00:00 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28030 27676 0 21:56 ? 00:00:01 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28036 27676 0 21:56 ? 00:00:00 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28039 27676 0 21:56 ? 00:00:01 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28080 27676 0 21:56 ? 00:00:00 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28081 27676 0 21:56 ? 00:00:01 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28083 27676 0 21:56 ? 00:00:04 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28086 27676 0 21:56 ? 00:00:01 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28087 27676 0 21:56 ? 00:00:05 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28093 27676 0 21:56 ? 00:00:00 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28103 27676 0 21:56 ? 00:00:00 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28109 27676 0 21:56 ? 00:00:00 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28110 27676 0 21:56 ? 00:00:00 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28117 27676 0 21:56 ? 00:00:01 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
dhiadm 28120 27676 0 21:56 ? 00:00:00 dw.sapDHI_DVEBMGS00 pf=/usr/sap/DHI/SYS/profile/DHI_DVEBMGS00_SAPDHI 
root 29089 5024 0 22:26 pts/0 00:00:00 grep dw.sap 
SAPDHI:/ # 

продолжатьTCPСетевое программирование, использованиеsend()Когда функция отправляет данные, она иногда встречаетWSAEWOULDBLOCKНеправильно, что это за хрень?

Пример кода

    iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
    if (iResult == SOCKET_ERROR)
    {
       int nLastError = WSAGetLastError();
       if (WSAEWOULDBLOCK == nLastError )
       {
            ...
       }
        ...
    }

WSAEWOULDBLOCK

WSAEWOULDBLOCK
10035
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.

WSAEWOULDBLOCKЭто не фатальная ошибка, и соответствующие операции следует повторить позже.

Анализ причин

WSAEWOULDBLOCK is not really an error but simply tells you that your send buffers are full.
This can happen if you saturate the network or if the other side simply doesn’t acknowledge the received data. Take a look at the select() function, which allows you to wait until buffer space is available or a timeout occurs. There is also a way to bind a win32 event to a stream, which then allows its use with WaitForMultipleObjects in case you want to abort waiting early.

Буфер ядра окна, который должен быть отправлен, заполнен и может быть отправлен только при наличии свободного времени.

Решение:

  • Перед отправкой поспите
while(nRet == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK)
{
    Sleep(50);
    nRet = send(...);
}

Этот тип мышления лучше всего складывать суждение о количестве раз, например, если более 20 раз, передача считается неудачной.

  • Увеличиватьsocketизkernel buffer
SOCKET ConnectSocket = ...
...
int nRcvBufferLen = 1024*1024;
int nSndBufferLen = 4*1024*1024;
int nLen          = sizeof(int);
setsockopt(ConnectSocket, SOL_SOCKET, SO_RCVBUF, (char*)&nRcvBufferLen, nLen);
setsockopt(ConnectSocket, SOL_SOCKET, SO_SNDBUF, (char*)&nSndBufferLen, nLen);

При отправке аудио и видео, еслиSO_SNDBUFЕсли настройка слишком мала, когда сетевая среда плохая, экран будет размытым (данные будут отправлены слишком поздно), и это явление не произойдет, если сетевая среда хорошая.

References:

https://msdn.microsoft.com/en-us/library/ms740149(VS.85).aspx
https://msdn.microsoft.com/en-us/library/ms740668(v=vs.85).aspx#WSAEWOULDBLOCK
http://www.cnblogs.com/chengxin1982/archive/2009/12/24/1631067.html
http://stackoverflow.com/questions/14546362/how-to-resolve-wsaewouldblock-error
https://bobobobo.wordpress.com/2008/11/09/resolving-winsock-error-10035-wsaewouldblock/

От: Аноним

 
Дата:  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);

Подождите ...

Wait...

  • Переместить
  • Удалить
  • Выделить ветку

Пока на собственное сообщение не было ответов, его можно удалить.

Понравилась статья? Поделить с друзьями:
  • Ошибка 10034 слк
  • Ошибка 10030 хонкай импакт
  • Ошибка 1003 недостаточно прав для записи wot
  • Ошибка 1003 штрих м
  • Ошибка 1003 что это