Форум программистов CodeGuru
22 Июнь 2018, 03:57:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Не получаю идентефикатор сокета при событии FD_CLOSE  (Прочитано 20235 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Professor
Новичок
*
Офлайн Офлайн

Сообщений: 3


Просмотр профиля
« : 31 Октябрь 2008, 22:02:04 »

Доброго времени суток. У меня какая-то проблема с получением идентефикатора сокета. Работаю Я с 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 оно всегда меняется, причем либо возростает, либо убывает!
Записан
Professor
Новичок
*
Офлайн Офлайн

Сообщений: 3


Просмотр профиля
« Ответ #1 : 04 Ноябрь 2008, 22:42:54 »

Люди добрые можете не отвечать я уже нашел ответ. Но всё равно спасибо за внимание!
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #2 : 05 Ноябрь 2008, 22:34:39 »

Улыбка
А в чем хоть было дело ?
Если не секрет Улыбка
Записан

Professor
Новичок
*
Офлайн Офлайн

Сообщений: 3


Просмотр профиля
« Ответ #3 : 06 Ноябрь 2008, 12:06:40 »

Просто оказалось что:

Цитировать
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 для слушающего сокета. Я просто создал новую константу WM_CLIENT_EVENT и потом...

Код:
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
...
ON_MESSAGE(WM_SERVER_EVENT,OnServerEvent)
ON_MESSAGE(WM_CLIENT_EVENT,OnClientEvent)
...
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

...
WSAAsyncSelect(clientsocket,hWnd,WM_CLIENT_EVENT, FD_CLOSE|FD_CONNECT|FD_READ|FD_WRITE);
...
WSAAsyncSelect(servsocket,hWnd,WM_SERVER_EVENT, FD_ACCEPT|FD_CLOSE|FD_CONNECT);
...

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

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

return 0L;
}

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

switch WSAGETSELECTEVENT(lParam)
{
case FD_READ:
str.Format("Client Socket Read wParam is: %d",wParam);
m_msServer.ReadData(wParam);
break;
case FD_WRITE:
str.Format("Client Socket Write wParam is: %d",wParam);
break;
case FD_CLOSE:
str.Format("Client Socket Close wParam is: %d",wParam);
m_msServer.CloseConnection(wParam);
break;
case FD_CONNECT:
str.Format("Client Socket Connect wParam is: %d",wParam);
break;
default:
str.Format("Client Socket Default");
break;
}
AfxMessageBox(str);

return 0L;
}

Вот и всё! Пеффко !
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!