Здравствуйте, 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 ();
}
Это точно решит твою проблему — сам с таким сталкивался