Hi!
Где-то год назад (примено) я разбирался с этой проблемой, но так и не разобрался.
Получилось толкько "коряво" выкрутиться — поставил тупой цикл, и оно аж c XX-й
попытки "прокатывало". Теперь снова разбираюсь, но тот вариант "меня устал".
Хочу по-уму сделать, а то подвисания страшные начинаются.
Прога — одноконнектный port-mapper.
Вобщем, вот тот текст, который я давно на форумы постил. Никто так и не нашел причину.
Чуть ниже сегодняшние дополнения.
========================
Вот примерный код.
Есть сокет — неблокирующий, привязанный до окна.
По прибытию соотв. мессаги (типа WM_ASYNC_CLIENTEVENT) идет
"case FD_READ:"
и
j=send(currentsock,buf, i, 0);
Если SOCKET_ERROR==j,
достаем код ошибки строкой
Err = WSAGetLastError();
Обычно код ошибки бывает такого типа —
"WSAECONNRESET (10054)" т.е. сам код — 10054
База — 10000, а 54 — конкретная ошибка.
Но у меня (Win2k, NT4) код ошибки возващает такой — 183. И бывает это
не часто. Редко, но метко. И коннекты потом повисают в воздухе.
Т.е. из другой области. Единственный файл, где можно встретить что-то
подходящее, это "error.h" (MVV 6.0) Там такая строка —
"#define ERROR_ALREADY_EXISTS 183"
Что-то я не совсем понимаю происходящего. Что бы это значило ?
От проблемы-то я избавился (но некорректно) — просто в цикле повторяю
send, пока ошибка не пропадет — вроде работает теперь.
===============================================================================
Это было тогда.
А сейчас я сделал буффер для приема в 10 байт и это проблема стала проявляться
как на дрожжах. Тогда я уже понял, что эта ошибка означает что-то вроде перегрузки сети, так как заметил я ее только на NT и 2000, имеющих неск. и-фейсов и работающик
как роутеры. А вот дома под 95 — все отлично.
Здравствуйте KMiNT21, Вы писали:
KMNT>Т.е. из другой области. Единственный файл, где можно встретить что-то KMNT>подходящее, это "error.h" (MVV 6.0) Там такая строка - KMNT>"#define ERROR_ALREADY_EXISTS 183" KMNT>Что-то я не совсем понимаю происходящего. Что бы это значило ?
Может это ?
183 Cannot create a file when that file already exists. ERROR_ALREADY_EXISTS
Здравствуйте, 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 ();
}
Это точно решит твою проблему — сам с таким сталкивался