На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Модераторы: Qraizer
  
> Трабл с неблокирующимися сокетами
    Доброго всем времечка суток,
    сорри за немного оффтоп, ИМХО, будет интересно кому-то ещё. Вот такая хренотень:
    //тривиальный SMTP обмен поскипано
    //сокет переведен в non-blocking режим
    DWORD dwBytes;
    char* pdata = data;
    do
    {
    dwBytes = sprintf(zIOBuffer, "\%.1024s", pdata);
    UINT i = 0;
    while (i<dwBytes)
    {
    rc = send(sSocket, zIOBuffer + i,dwBytes - i,0);
    if (rc==SOCKET_ERROR)
    {
    int err;
    int errlen = sizeof(err);
    getsockopt(sSocket, SOL_SOCKET, SO_ERROR, (char*)&err, &errlen);
    if (err != WSAEWOULDBLOCK) break;
    continue;
    };
    i+=rc;
    /*if (rc>0)*/ Sleep(20);
    }
    if (rc==SOCKET_ERROR) break;
    pdata+=dwBytes;

    } while(dwBytes==1024);
    if(SOCKET_ERROR == rc) goto thread_exit;
    в проге отправки почты чудненько работает на компе в локалке через Wingate. Отправляет _data_ буфер любой длины. Как только на dial-up ном компе - при отправке _data_ больше 3-4 Кбайт затыкается с SOCKET_ERROR, при этом WSAGetLastError()возвращает 0. Уменьшаю длину блока в zIOBuffer с 1024 до 256 байт - длина отправляемого буфера увеличивается до 5-6 Кбайт. На http://tangentsoft.net/wskfaq/ по этому поводу явно ничего не сказано :(
    Кто имеет опыт, поделитесь плиз.
      а в каком месте вылетает:?
      и еще, чем не устраивают блокируемые сокеты?
      ведь трабла имхо какраз от неблокируемости, один send еще не послал свою порцию, как уже следующий send пытаеться что-т послать...
        Вываливается через несколько циклов вызова send(). Если код в буфере небольшой, он успевает отправиться полностью до появления SOCKET_ERROR, отличного от WSAEWOULDBLOCK.
        Чем не устраивают блокирующиеся? Прога предусматривает до 4 сокетов одновременно (по 3м - отправка, по 1му - приём), а ышо на компе может быть ХЗ сколько прог запущено... Не начнёт ли процессорноё время подъедать?
        "...трабла имхо какраз от неблокируемости, один send еще не послал свою порцию, как уже следующий send пытаеться что-т послать..."
        Как так?
          Сорри за ламерский "как так?"... ну да, send() сразу же возвращается. Заработала такая фигня:
          DWORD dwBytes;
          char* pdata = data;
          do
          {
          dwBytes = sprintf(zIOBuffer, "\%.1024s", pdata);
          UINT i = 0;
          while (i<dwBytes)
          {
          do
          {
          if ((rc = send(sSocket, zIOBuffer + i,dwBytes - i,0))!=SOCKET_ERROR) break;
          } while (WSAGetLastError() == WSAEWOULDBLOCK);
          i+=rc;
          if (rc>0) Sleep(20);
          }
          if (rc==SOCKET_ERROR) break;
          pdata+=dwBytes;

          } while(dwBytes==1024);
          if(SOCKET_ERROR == rc) goto thread_exit;
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0503 ]   [ 16 queries used ]   [ Generated: 28.04.24, 05:10 GMT ]