Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не получаю идентификатор сокета при FD_CLOSE 
V
    Опции темы
VardanK
Дата 1.11.2008, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 13.5.2008

Репутация: нет
Всего: нет



Доброго времени суток. У меня какая-то проблема с получением идентефикатора сокета. Работаю Я с WinSock 2.

В моей программе я вызываю функцию WSAAsyncSelect(servsocket,hWnd,WM_SERVER_EVENT, FD_ACCEPT|FD_CLOSE)
где WM_SERVER_EVENT у меня равен WM_USER+2.

После чего отлавливаю сообщение WM_SERVER_EVENT следующим образом
Код

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
    //{{AFX_MSG_MAP(CMainFrame)
    ...
    ON_MESSAGE(WM_SERVER_EVENT,OnServerEvent)
    ...
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

...

afx_msg LRESULT CMainFrame::OnServerEvent(WPARAM wParam, LPARAM lParam)
{
    CString str;

    switch WSAGETSELECTEVENT(lParam)
    {
    case FD_ACCEPT:
        str.Format("Accept wParam is: %d",wParam);
        m_msServer.AcceptConnection();
        break;
    case FD_CLOSE:
        str.Format("Close wParam is: %d",wParam);
        m_msServer.CloseConnection(wParam);
        break;
    default:
        str.Format("Default");
        break;
    }
    AfxMessageBox(str);

    return 0L;
}


Так вот в MSDN написанно что: The wParam parameter identifies the socket on which a network event has occurred.
Но на практике оказывается что это не так. Для FD_ACCEPT оно в течении одного сеанса (т.е. программа клиента не перезапускается) не меняется а для FD_CLOSE оно всегда меняется, причем либо возростает, либо убывает!
PM MAIL   Вверх
J0ker
Дата 3.11.2008, 04:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 1
Всего: 14



Цитата(VardanK @  1.11.2008,  10:22 Найти цитируемый пост)
Для FD_ACCEPT оно в течении одного сеанса (т.е. программа клиента не перезапускается) не меняется

потому, что FD_ACCEPT сообщает вам что на слушающем сокете появилось входящее соединение - дескриптор сокета в wParam - это слушающий сокет. Для получения нового присоединившегося сокета надо вызвать WSAAccept
читайте мануалы до конца


--------------------
user posted image
PM MAIL   Вверх
VardanK
Дата 4.11.2008, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 13.5.2008

Репутация: нет
Всего: нет



Спасибо большое за подсказку. Я последовал ей с поправкой (до конца) -> (повнимателнее)  и оказалось что:
Цитата

The socket created by the accept function has the same properties as the listening socket used to accept it. Consequently, WSAAsyncSelect events set for the listening socket also apply to the accepted socket. For example, if a listening socket has WSAAsyncSelect events FD_ACCEPT, FD_READ, and FD_WRITE, then any socket accepted on that listening socket will also have FD_ACCEPT, FD_READ, and FD_WRITE events with the same wMsg value used for messages. If a different wMsg or events are desired, the application should call WSAAsyncSelect, passing the accepted socket and the desired new information.

Т.е. сообщение для FD_CLOSE перехватывалось для клиентского сокета, а FD_ACCEPT для слушающего сокета.

СПАСИБО!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.