Форум: "Сети";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
ВнизWSACleanup Найти похожие ветки
← →
Ильичев С.А. © (2005-07-26 20:55) [0]Объясните мне пожалуйста, как так.
Во втором потоке открываю сокет на прослушивание.
В первом вызываю WSACleanup.
Сокет остаётся.
Вызываю WSACleanup + TerminateThread.
Поток умирает, сокет остаётся.
Проверяю код возврата.
WSACleanup = 0.
Читаю MSDN.
Sockets that were open when WSACleanup was called are reset and automatically deallocated as if closesocket were called;
_и вот ещё
In a multithreaded environment, WSACleanup terminates Windows Sockets operations for all threads.
← →
Чапаев © (2005-07-27 09:34) [1]А что значит "сокет остаётся"?
← →
Ильичев С.А. © (2005-07-27 11:45) [2]2 Чапаев
Значит что порт который я заказывал открыт от имени моего процесса.
И к нему можно подключиться.
← →
Digitman © (2005-07-27 11:51) [3]
> к нему можно подключиться
читай в msdn requires-комментарии для сервера:
Requires Windows Server 2003, Windows 2000 Server, or Windows NT Server.
а у тебя - WinXP ..
← →
GLFox © (2005-07-27 11:54) [4]>Digitman © (27.07.05 11:51) [3]
А еще там написано следующее:
Included in Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, and Windows 95.
← →
Digitman © (2005-07-27 12:33) [5]
> GLFox © (27.07.05 11:54) [4]
где там это написано ?
я смотрю это
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/wsacleanup_2.asp
и не вижу там ничего подобного.. хотя и без этого понятно, что ф-ция включена в состав WinsockAPI перечисленных тобой ОС
другой вопрос, КАК ведет себя эта ф-ция на той или иной ОС..
← →
GLFox © (2005-07-27 12:39) [6]>Digitman © (27.07.05 12:33) [5]
Именно по этому адресу и написано! Тебя наверно вводит в заблуждение надписи типа "Client: requires..." и "Server: requires...". Там не имеется ввиду приложение, а только система.
← →
DiamondShark © (2005-07-27 12:45) [7]У дигитмана вообще хронические проблемы с чтением книг без видения фиг.
← →
Digitman © (2005-07-27 13:00) [8]
> Там не имеется ввиду приложение, а только система
и я речь веду о системе
← →
Digitman © (2005-07-27 13:06) [9]
> DiamondShark © (27.07.05 12:45) [7]
тявкание из-за угла ?
или по сабжу есть что сказать ?
← →
DiamondShark © (2005-07-27 14:11) [10]
> Digitman © (27.07.05 13:06) [9]
Тявкал твой дед.
А по сабжу есть что сказать.
Например, поинтересоваться у автора, уверен ли он, что у него WSAStartup вызывается одни, а не несколько раз, и что количество вызовов WSACleanup равно количеству вызовов WSAStartup.
Вот только не уверен, что он захочет отвечать на наводящие вопросы, после того, как ты тут вонищу развёл.
← →
Ильичев С.А. © (2005-07-27 14:27) [11]Проверить сейчас негде, но уверен что проблема в >[3] Digitman.
Только я не понял как с этим бороться.
То есть мне надо из первого потока закрывать сокет во втором.
И других вариантов не что ли ?
← →
Ильичев С.А. © (2005-07-27 14:31) [12]2 DiamondShark
А ты чё такой наглый ?
← →
DiamondShark © (2005-07-27 14:33) [13]
> Ильичев С.А. © (27.07.05 14:27) [11]
В [3] тебе пургу нагнали.
Описанное поведение возможно только в случае, когда WSAStartup вызывается несколько раз.
Тогда все вызовы WSACleanup, кроме последнего, будут холостыми.
Анализируй код, ищи лишние вызовы WSAStartup.
← →
DiamondShark © (2005-07-27 14:34) [14]
> Ильичев С.А. © (27.07.05 14:31) [12]
Не нравится -- иди в жопу.
Для него стараются, а он тут ещё морализаторством занялся.
← →
Digitman © (2005-07-27 14:55) [15]
> DiamondShark © (27.07.05 14:34) [14]
редкий ты хам, сударь.
реже меня - уж точно))
> Ильичев С.А
мысль насчет равенства кол-ва вызовов Startup кол-ву вызовов Cleanup, разумеется, верная - открытая в ДАННОМ трэде сессия должна быть закрыта ... но начиналось это с маздайной платформы, о которой и идет речь в борландовской справке .. к моменту актуализации NT-based ОС баланс вызовов этих ф-ций также должен соблюдаться, но теперь уже на уровне процесса в целом
с др.стороны непонятно, почему ты игнорируешь явные closesocket(), пытаясь оборвать разом все соединения упомянутым сомнительным способом .. причем - неизвестно в каких тредах ..
← →
Ильичев С.А. © (2005-07-28 01:04) [16]2 DiamondShark
Уж кому там место, так это тебе.
2 Digitman
С равенством всё в порядке.
А closesocket() я не игнорирую. Пока что так и сделал, но хотелось бы разобраться что к чему.
← →
Digitman © (2005-07-28 10:34) [17]
> Ильичев С.А. © (28.07.05 01:04) [16]
обрати внимание на порядок и логику вызовов WSAStartup/Cleanup самим Борландом в классt TCustomWinSocket
как известно, Борланд писал эти классы руководствуясь соображениями совместимости своего кода с маздайной и НТ-платформой
в этих классах не делается никаких предположений относительно трэдов, в которых вызываются эти ф-ции - всякий раз при конструировании объекта класса TCustomWinSocket безо всяких проверок вызывается WSAStartup(), а при разрушении объекта - соотв-но WSACleanup
это
http://book.itep.ru/7/sock_71.htm
тебе должно хоть чем-то помочь
← →
Ильичев С.А. © (2005-07-28 13:24) [18]Да я не использую TCustomWinSocket.
Только
socket()
bind()
listen()
← →
DiamondShark © (2005-07-28 13:43) [19]
> С равенством всё в порядке.
Брешешь.
Ситуация, описанная у тебя в вопросе воспроизводится только при одном условии: несоответствие количества вызовов стартап и клинап.
Либо описывай точнее, либо ищи в коде несоответсвие, либо приводи минимальный законченый воспроизводимый код.
← →
Digitman © (2005-07-28 14:05) [20]
> Ильичев С.А. © (28.07.05 13:24) [18]
> Да я не использую TCustomWinSocket.
а кто от тебя это требует ?
не хочешь ? не используй !
я просто порекомендовал тебе посмотреть, как сам Борланд работает с этими ф-циями в этом классе ... а работает он с ними вполне корректно и осмысленно, хотя его логика как бы явно противоречит msdn-описанию - разрушение экз-ра TCustomWinSocket, при котором вызывается WSACleanup, никак не влияет на работу прочих гнезд (созданных в том же и иных трэдах), ассоциированных с другими экз-рами TCustomWinSocket
> In a multithreaded environment, WSACleanup terminates Windows
> Sockets operations for all threads
здесь, вероятно, имелось ввиду, что созданное в некоем трэде (после WSAStartup) гнездо м.б. использовано не только в создавшем его трэде, но и в иных трэдах процесса ... при этом если создавший гнездо трэд выполнил WSACleanup не вызвав closesocket(), прочие трэды, инициировавшие некие операции (синхронные или асинхронные) с этим гнездом, в рез-те вызова трэдом-создателем ф-ции WSACleanup получат отказ : гнездо после WSACleanup более не существует
← →
Ильичев С.А. © (2005-08-01 05:22) [21]Всё, нашёл ошибку. Спасибо.
← →
Digitman © (2005-08-01 13:16) [22]
> Ильичев С.А. © (01.08.05 05:22) [21]
делись ..
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.056 c