Re: [W2k/NT] WSAGetLastError()==183 ??????????????????
От: Gabber Россия  
Дата: 10.04.03 13:07
Оценка:
Здравствуйте, KMiNT21, Вы писали:

KMN>Hi!

KMN>Где-то год назад (примено) я разбирался с этой проблемой, но так и не разобрался.
KMN>Получилось толкько "коряво" выкрутиться — поставил тупой цикл, и оно аж c XX-й
KMN>попытки "прокатывало". Теперь снова разбираюсь, но тот вариант "меня устал".
KMN>Хочу по-уму сделать, а то подвисания страшные начинаются.
KMN>Прога — одноконнектный port-mapper.

KMN>Вобщем, вот тот текст, который я давно на форумы постил. Никто так и не нашел причину.

KMN>Чуть ниже сегодняшние дополнения.

KMN>========================

KMN>Вот примерный код.
KMN>Есть сокет — неблокирующий, привязанный до окна.
KMN>По прибытию соотв. мессаги (типа WM_ASYNC_CLIENTEVENT) идет
KMN>"case FD_READ:"
KMN>и

KMN>j=send(currentsock,buf, i, 0);

KMN>Если SOCKET_ERROR==j,
KMN>достаем код ошибки строкой
KMN>Err = WSAGetLastError();

KMN>Обычно код ошибки бывает такого типа -


KMN>"WSAECONNRESET (10054)" т.е. сам код — 10054

KMN>База — 10000, а 54 — конкретная ошибка.

KMN>Но у меня (Win2k, NT4) код ошибки возващает такой — 183. И бывает это

KMN>не часто. Редко, но метко. И коннекты потом повисают в воздухе.
KMN>Т.е. из другой области. Единственный файл, где можно встретить что-то
KMN>подходящее, это "error.h" (MVV 6.0) Там такая строка -
KMN>"#define ERROR_ALREADY_EXISTS 183"
KMN>Что-то я не совсем понимаю происходящего. Что бы это значило ?
KMN>От проблемы-то я избавился (но некорректно) — просто в цикле повторяю
KMN>send, пока ошибка не пропадет — вроде работает теперь.
KMN>===============================================================================

KMN>Это было тогда.

KMN>А сейчас я сделал буффер для приема в 10 байт и это проблема стала проявляться
KMN>как на дрожжах. Тогда я уже понял, что эта ошибка означает что-то вроде перегрузки сети, так как заметил я ее только на NT и 2000, имеющих неск. и-фейсов и работающик
KMN>как роутеры. А вот дома под 95 — все отлично.

Проблема в том, что у тебя до вызова WSAGetLastError происходит какая-то дисковая операция (например ты в лог что-то пишешь или еще что-то) она и забивает код ошибки.
j = send (...);
if (j == SOCKET_ERROR)
{
// происходит вызов дисковых ф-ий который забивает оишбку
Err = WSAGetLastError ();
}

Это точно решит твою проблему — сам с таким сталкивался

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