Шаг 6 - Связь окна с сокетом для получения сообщений
Делаем еще один проект. Ну цифры там только меняются. А проект такой же.
При работе сервера :-) ему будут посылаться сообщения. Вот для их получения необходимо указать куда они пойдут. Это делается функцией WSAAsyncSelect. Только здесь есть одна загвоздка. В этой функции есть один параметр HWND. А у нас консольное приложение. И просто так вы его не получите. Это в MFC или при чистом кодировании на C он получаеться автоматом. Нет уж. Здесь нужна функция. Мы будем находить HWND используя функцию WIN32 API с именем FindWindow она нам как раз и вернет HWND окна.
Эта функция находится в USER32.DLL для того, чтобы ею воспользоваться нам нужен USER32.LIB. Подключите её.
Для того, чтобы воспользоваться именем окна его нужно знать. Так лучше самому его дать и не гадать. Я его определил как:
#define NAME_SERVER_SOCKET "This is HTTP server version 1.0"
А теперь функция получения HWND
HWND GetConsoleHWND()
{
SetConsoleTitle(NAME_SERVER_SOCKET);
HWND hwndConsoleWindow;
hwndConsoleWindow=FindWindow(NULL, NAME_SERVER_SOCKET);
if (hwndConsoleWindow==0)
{
printf("Error Find Window");
exit(0);
}
return hwndConsoleWindow;
}
Смотрите, функцией SetConsoleTitle я устанавливаю своё название окна. И ищу это окно.
Как всегда я вынес старый шаг в функцию.
void LinkSoketPort();
Кроме того я добавил в конец main функцию SLEEP, слишком быстро у меня пропадает окно :-) Хотя запускать программу можно и в сеансе MS DOS, но почему-то Norton Commander'а у меня нет :-))), а пользоваться CD при длинных именах каталогов мне не хочется.
void main()
{
StartWinSock();
WaitSocket();
StopWinSock();
Sleep(1000);
printf("Cansel Work \n");
}
Итак к делу. Вот код.
void WaitSocket()
{
SocketGetHostName();
CreateSocket();
LinkSoketPort();
int Errors;
Errors=WSAAsyncSelect(servsocket,GetConsoleHWND(),WM_SERVER_ACCEPT, FD_ACCEPT);
if (Errors == SOCKET_ERROR)
{
printf(" AsyncSelect BAD !!! \n");
exit(1);
}
else printf("God AsyncSelect !!!!!!! \n");
CloseScoket();
}
Функция WSAAsyncSelect связывает сообщения сокетов с окном.
int WSAAsyncSelect (
SOCKET s,
HWND hWnd,
unsigned int wMsg,
long lEvent
);
Здесь интересен параметр unsigned int wMsg - этот параметр говорит о том, какое сообщение будет послано в случае подключения к серверу. Я его описал вот так.
const int WM_SERVER_ACCEPT = WM_USER+1;
При успешном выполнении функции возвращается ноль, иначе SOCKET_ERROR.
Загрузить проект | Предыдущий шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|