![]() |
![]() |
|
![]() |
||||||||||||||||||
![]() |
![]() |
![]() |
||||||||||||||||
|
![]() |
|
![]() |
|
||||||||||||||
![]() |
![]() |
![]() |
Шаг 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. Загрузить проект | | | Автор Каев Артем. |
![]() |
![]() |
![]() |
|