Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Не получаю идентификатор сокета при FD_CLOSE


Автор: VardanK 1.11.2008, 10:22
Доброго времени суток. У меня какая-то проблема с получением идентефикатора сокета. Работаю Я с 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 оно всегда меняется, причем либо возростает, либо убывает!

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

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

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

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 для слушающего сокета.

СПАСИБО!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)