Шаг 6 - Связь окна с сокетом для получения сообщений

Делаем еще один проект. Ну цифры там только меняются. А проект такой же.

При работе сервера :-) ему будут посылаться сообщения. Вот для их получения необходимо указать куда они пойдут. Это делается функцией WSAAsyncSelect. Только здесь есть одна загвоздка. В этой функции есть один параметр HWND. А у нас консольное приложение. И просто так вы его не получите. Это в MFC или при чистом кодировании на C он получаеться автоматом. Нет уж. Здесь нужна функция. Мы будем находить HWND используя функцию WIN32 API с именем FindWindow она нам как раз и вернет HWND окна.

Эта функция находится в USER32.DLL для того, чтобы ею воспользоваться нам нужен USER32.LIB. Подключите её.

gif/6_1.gif (5057 b)

Для того, чтобы воспользоваться именем окна его нужно знать. Так лучше самому его дать и не гадать. Я его определил как:

#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.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.