| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры.|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
 

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

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

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

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

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


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

By Artem.
Используются технологии uCoz
 

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz