![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WSACleanup [D7, WinXP]
Ильичев С.А. © (2005-07-26 20:55:00)Объясните мне пожалуйста, как так.
Во втором потоке открываю сокет на прослушивание.
В первом вызываю 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.
Digitman (2005-08-01 13:16:00) [1]
> Ильичев С.А. © (01.08.05 05:22) [21]
делись ..
Ильичев С.А. (2005-08-01 05:22:00) [2]Всё, нашёл ошибку. Спасибо.
Digitman (2005-07-28 14:05:00) [3]
> Ильичев С.А. © (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 более не существует
DiamondShark (2005-07-28 13:43:00) [4]
> С равенством всё в порядке.
Брешешь.
Ситуация, описанная у тебя в вопросе воспроизводится только при одном условии: несоответствие количества вызовов стартап и клинап.
Либо описывай точнее, либо ищи в коде несоответсвие, либо приводи минимальный законченый воспроизводимый код.
Ильичев С.А. (2005-07-28 13:24:00) [5]Да я не использую TCustomWinSocket.
Только
socket()
bind()
listen()
Digitman (2005-07-28 10:34:00) [6]
> Ильичев С.А. © (28.07.05 01:04) [16]
обрати внимание на порядок и логику вызовов WSAStartup/Cleanup самим Борландом в классt TCustomWinSocket
как известно, Борланд писал эти классы руководствуясь соображениями совместимости своего кода с маздайной и НТ-платформой
в этих классах не делается никаких предположений относительно трэдов, в которых вызываются эти ф-ции - всякий раз при конструировании объекта класса TCustomWinSocket безо всяких проверок вызывается WSAStartup(), а при разрушении объекта - соотв-но WSACleanup
это
http://book.itep.ru/7/sock_71.htm
тебе должно хоть чем-то помочь
Ильичев С.А. (2005-07-28 01:04:00) [7]2 DiamondShark
Уж кому там место, так это тебе.
2 Digitman
С равенством всё в порядке.
А closesocket() я не игнорирую. Пока что так и сделал, но хотелось бы разобраться что к чему.
Digitman (2005-07-27 14:55:00) [8]
> DiamondShark © (27.07.05 14:34) [14]
редкий ты хам, сударь.
реже меня - уж точно))
> Ильичев С.А
мысль насчет равенства кол-ва вызовов Startup кол-ву вызовов Cleanup, разумеется, верная - открытая в ДАННОМ трэдесессия должна быть закрыта ... но начиналось это с маздайной платформы, о которой и идет речь в борландовской справке .. к моменту актуализации NT-based ОС баланс вызовов этих ф-ций также должен соблюдаться, но теперь уже на уровне процесса в целом
с др.стороны непонятно, почему ты игнорируешь явные closesocket(), пытаясь оборвать разом все соединения упомянутым сомнительным способом .. причем - неизвестно в каких тредах ..
DiamondShark (2005-07-27 14:34:00) [9]
> Ильичев С.А. © (27.07.05 14:31) [12]
Не нравится -- иди в жопу.
Для него стараются, а он тут ещё морализаторством занялся.
DiamondShark (2005-07-27 14:33:00) [10]
> Ильичев С.А. © (27.07.05 14:27) [11]
В [3] тебе пургу нагнали.
Описанное поведение возможно только в случае, когда WSAStartup вызывается несколько раз.
Тогда все вызовы WSACleanup, кроме последнего, будут холостыми.
Анализируй код, ищи лишние вызовы WSAStartup.
Ильичев С.А. (2005-07-27 14:31:00) [11]2 DiamondShark
А ты чё такой наглый ?
Ильичев С.А. (2005-07-27 14:27:00) [12]Проверить сейчас негде, но уверен что проблема в >[3] Digitman.
Только я не понял как с этим бороться.
То есть мне надо из первого потока закрывать сокет во втором.
И других вариантов не что ли ?
DiamondShark (2005-07-27 14:11:00) [13]
> Digitman © (27.07.05 13:06) [9]
Тявкал твой дед.
А по сабжу есть что сказать.
Например, поинтересоваться у автора, уверен ли он, что у него WSAStartup вызывается одни, а не несколько раз, и что количество вызовов WSACleanup равно количеству вызовов WSAStartup.
Вот только не уверен, что он захочет отвечать на наводящие вопросы, после того, как ты тут вонищу развёл.
Digitman (2005-07-27 13:06:00) [14]
> DiamondShark © (27.07.05 12:45) [7]
тявкание из-за угла ?
или по сабжу есть что сказать ?
Digitman (2005-07-27 13:00:00) [15]
> Там не имеется ввиду приложение, а только система
и я речь веду о системе
DiamondShark (2005-07-27 12:45:00) [16]У дигитмана вообще хронические проблемы с чтением книг без видения фиг.
GLFox (2005-07-27 12:39:00) [17]>Digitman © (27.07.05 12:33) [5]
Именно по этому адресу и написано! Тебя наверно вводит в заблуждение надписи типа "Client: requires..." и "Server: requires...". Там не имеется ввиду приложение, а только система.
Digitman (2005-07-27 12:33:00) [18]
> 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 11:54:00) [19]>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 11:51:00) [20]
> к нему можно подключиться
читай в msdn requires-комментарии для сервера:
Requires Windows Server 2003, Windows 2000 Server, or Windows NT Server.
а у тебя - WinXP ..