Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.184.237] |
|
Сообщ.
#1
,
|
|
|
Доброго всем времечка суток,
сорри за немного оффтоп, ИМХО, будет интересно кому-то ещё. Вот такая хренотень: //тривиальный 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/ по этому поводу явно ничего не сказано Кто имеет опыт, поделитесь плиз. |
Сообщ.
#2
,
|
|
|
а в каком месте вылетает:?
и еще, чем не устраивают блокируемые сокеты? ведь трабла имхо какраз от неблокируемости, один send еще не послал свою порцию, как уже следующий send пытаеться что-т послать... |
Сообщ.
#3
,
|
|
|
Вываливается через несколько циклов вызова send(). Если код в буфере небольшой, он успевает отправиться полностью до появления SOCKET_ERROR, отличного от WSAEWOULDBLOCK.
Чем не устраивают блокирующиеся? Прога предусматривает до 4 сокетов одновременно (по 3м - отправка, по 1му - приём), а ышо на компе может быть ХЗ сколько прог запущено... Не начнёт ли процессорноё время подъедать? "...трабла имхо какраз от неблокируемости, один send еще не послал свою порцию, как уже следующий send пытаеться что-т послать..." Как так? |
Сообщ.
#4
,
|
|
|
Сорри за ламерский "как так?"... ну да, 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; |