С++ Winsock 2 вопроса

Я прочитал документацию для Winsock2 в MSDN, но мне все еще нужны разъяснения по нескольким вещам, если кто-нибудь может помочь.

Я планировал сделать что-то вроде настройки, которую вы получаете при использовании WSAAsyncSelect(), но используя отдельный поток. Могу ли я использовать WSAEventSelect(), чтобы связать более одного сокета с одним объектом события?

Если вместо этого я использовал порт завершения, какие события я получу через порт завершения? В MSDN есть список операций с файлами, но у меня возникли проблемы с их связью с тем, какие события (FD_READ, FD_WRITE и т. д.) будут отправляться через порт завершения. Есть ли способ узнать, какое событие завершается? или я должен принять это к сведению и сохранить в структуре каждый раз, когда я что-то отправляю или получаю?

спасибо за любую * помощь, которую кто-нибудь может дать мне в этом = D

редактировать: еще лучше, не лучше ли мне просто переключиться на С#, чтобы сделать это? Он кажется очень популярным и лучше подходит для этой конкретной задачи.


person CuriousGeorge    schedule 30.07.2010    source источник
comment
Обычно я просто использую функции POSIX, такие как select(), а не причудливые функции Winsock. Вроде нормально работают.   -  person Michael J    schedule 30.07.2010


Ответы (2)


Нет, вы не можете связать несколько сокетов с одним WSAEVENT. Вы должны вызывать WSACreateEvent() и WSAEventSelect() для каждого отдельного сокета, для которого вы хотите получать уведомления. Однако вы можете использовать WSAWaitForMultipleEvents(), чтобы один поток ожидал событий из нескольких сокетов.

Что касается использования портов завершения, я предлагаю вам прочитать статьи MSDN по этому вопросу, например:

Windows Sockets 2.0: создание масштабируемых приложений Winsock с использованием портов завершения.

person Remy Lebeau    schedule 02.08.2010
comment
в то время я не полностью понимал порты завершения ... но я довольно много читал по этой теме, и теперь моя текущая конфигурация вообще не нуждается в объектах событий. Я не знал, что AcceptEx() вызовет порт завершения... так что это в значительной степени решило мою проблему. Спасибо - person CuriousGeorge; 06.08.2010

[Отказ от ответственности: у меня крайне ограниченный опыт программирования сокетов.]

Я планировал сделать что-то вроде настройки, которую вы получаете при использовании WSAAsyncSelect(), но используя отдельный поток. Могу ли я использовать WSAEventSelect(), чтобы связать более одного сокета с одним объектом события?

Это не имеет смысла. О событии можно сообщить только один раз. Поэтому, если бы у вас было несколько сокетов, подключенных к одному и тому же событию, то, когда оно получает сигнал, вы никогда не знали бы, какой сокет сигнализировал о событии!

Что вы можете сделать, так это создать событие для каждого сокета (возможно, несколько событий на сокет: для каждого интересующего вас события FD_*) и использовать WSAWaitForMultipleEvents ( http://msdn.microsoft.com/en-us/library/ms742219%28v=VS.85%29.aspx )

person Martin Ba    schedule 30.07.2010
comment
вот тут я в замешательстве. Если то, что вы говорите, правда, то что произойдет, если один сокет получит два события чтения подряд? не будет ли API ждать вызова WSAEnumNetworkEvents() для сброса события, прежде чем сигнализировать об этом снова? - person CuriousGeorge; 31.07.2010
comment
Я не знаю. Я не ожидаю, что API будет таким умным. То есть да, я полностью ожидаю, что событие будет установлено только один раз. - person Martin Ba; 02.08.2010