Делаем еще один проект. Ну цифры там только меняются. А проект такой же.
При работе сервера :-) ему будут посылаться сообщения. Вот для их получения необходимо указать куда они пойдут. Это делается функцией 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.