Ваш выбор действительно. Если вы думаете, что вам повезет больше с другой реализацией сокетов, сделайте это.
Однако у Microsoft много разработчиков (и я считаю, что некоторые из них могут даже быть хорошими). Вы можете, просто , возможно , захотеть рассмотреть возможность того, что ошибка не все лежит на своем конце.
Количество помощи, которую вы можете получить для их API и продуктов, на мой взгляд, тоже хорошее.
Возможно, если бы вы потратили время на то, чтобы понять модель MFC, вы бы получили момент «АГА» и лучше его поняли. Я не фанат Winsock - я больше привык к миру UNIX, где синхронизация была подходящим способом, и вы просто запускали отдельные процессы / потоки, если вам нужно асинхронное поведение.
CAsyncSocket, я подозреваю, все еще испытывает затруднения из-за того, что MFC является однопоточной моделью (с точки зрения графического интерфейса пользователя), даже несмотря на то, что в течение долгого времени в Windows были реальные упреждающие потоки. [Возможно, я ошибаюсь из-за этого комментария подколенного сухожилия, я давно не использовал Win32].
Обновление:
Исходя из вашего обновления, в котором вы указали, что делаете, я уверен, что вам не разрешено подключаться до создания. Цитата http://msdn.microsoft.com/en-us/library/3d46645f(VS.80).aspx,
Чтобы использовать объект CAsyncSocket, вызовите его конструктор, затем вызовите функцию Create, чтобы создать базовый дескриптор сокета ... и для клиентского сокета вызовите функцию-член Connect.
Что касается того, почему, я думаю, что это дополнительная сложность, потому что Windows должна делать асинхронные сокеты в среде с обработкой событий, так как они не могут блокировать основной поток GUI.
В средах UNIXy либо отсутствует поток событий (обычные процессы), либо сетевые операции просто передаются другому потоку вручную (в приложениях с графическим интерфейсом).
Скорее всего, это было дизайнерское решение, принятое давно в WinSock (возможно, в Windows 3.11, которая была гораздо более строгой средой для выполнения асинхронных операций) и претворенное в жизнь [хотя это и предположение с моей стороны, API сокетов UNIX имеет никогда не было такого асинхронного поведения, когда сообщения перекачивались, всегда использовались select()
или потоки / процессы].
Дальнейшее обновление:
Это утверждение (не исключение) обычно возникает, если вы закрыли и / или удалили объект сокета во время ожидающей операции над ним. В вашем случае я бы посоветовал установить соединение, когда вы его закрываете.
Затем, когда соединение успешно или неудачно, вызывается обратный вызов, и он не может найти ваш сокет в таблицах.
Это не проблема MFC, это код вашего друга, нарушающий контракт. Если вы выполняете соединение (или любую асинхронную операцию), вам нужно дождаться успеха или неудачи, прежде чем закрывать сокет (или работать дальше) - в этом случае это означает ожидание вызова вашего Функция OnConnect ().
Из памяти вы вызываете create()
при создании асинхронного сокета, тогда все остальное происходит в ответ на сообщения, поступающие в очередь сообщений (то есть вызовы ваших OnXXX()
функций). Как и все графические элементы Win32, сообщения должны управлять программой (код запускается в ответ на сообщения). Этот код все больше и больше напоминает классическое кодирование, когда программа управляет всем - этот путь - безумие, поскольку ваша программа и асинхронный сокет «поток» борются за контроль.
Я давно не смотрел на это, но вы сможете получить пример программы CHATSRVR, которая покажет вам, как это сделать.