#include "stdafx.h"
#include "winsock.h"
#include <iostream>
#define PORT_ADDR 80 // порт подключения
#define NAME_SERVER_SOCKET L"This is HTTP server version 1.0" // имя консоли сервера
using namespace std;
const int WM_SERVER_ACCEPT = WM_USER+1;// наше сообщения серверу
const int WINSOCK_VERSION = 0x0101; // версия библиотеки
const int DEFAULT_PROTOCOL=0; // протокол по умолчанию
WSADATA wsaData;
SOCKET servsocket;
#define QUEUE_SIZE 5 // колличество разрешенных подключений
HWND hwndc;
typedef u_int SOCKET;
void StartWinSock(); // подключение библиотеки
void StopWinSock(); // отключение библиотеки
void WaitSocket(); // функция ожидания
void SocketGetHostName(); // функция получения локального имени хоста
void CreateSocket(); // функция создания сокета
void CloseScoket(); // функция закрытия сокета
void LinkSoketPort(); // функция соединения сокета с портом
HWND GetConsoleHWND(); // функция получения хендла консоли сервера
void LinkWindowScoket(); // функция соединения сокета с окном консоли
void main()
{
MSG msg;
setlocale(LC_ALL, "Russian_Russia.1251");
// GetConsoleHWND();
StartWinSock();
SocketGetHostName();
CreateSocket();
LinkSoketPort();
LinkWindowScoket();
WaitSocket();
// Цикл основного сообщения:
while (GetMessage(&msg, NULL, WM_SERVER_ACCEPT, WM_SERVER_ACCEPT))
{
printf("К нам присоединились!!! :-) \n");
}
CloseScoket();
StopWinSock();
}
void StartWinSock()
{
if (WSAStartup(WINSOCK_VERSION, &wsaData))
{
printf ("Библиотека не инициализирована!!!\n");
WSACleanup();
}
else printf("Успешная инициализация библиотеки!\n");
}
void StopWinSock()
{
if (WSACleanup())
printf("Ошибка завершения!!!\n");
else
printf("Успешное закрытие!\n");
}
void SocketGetHostName()
{
char chInfo[64];
if (gethostname(chInfo,sizeof(chInfo)))
{
printf("Локальный хост отсутствует!!!\n");
return;
}
else
{
printf("Имя локального хоста: ");
printf(chInfo);printf("\n");
}
}
void CreateSocket()
{
servsocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (servsocket==INVALID_SOCKET)
{
printf("Ошибка создания сокета :-(\n");
exit(1);
}
else
{
printf("Сокет успешно создан и ожидает связи :-)\n");
}
}
void LinkSoketPort()
{
struct sockaddr_in{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];};
struct in_addr {
union {
struct{
unsigned char
s_b1,
s_b2,
s_b3,
s_b4;
} S_un_b;
struct{
unsigned short
s_w1,
s_w2;
} S_un_w;
unsigned long S_addr;
} S_un;
};
SOCKADDR_IN socketaddr;
socketaddr.sin_family = AF_INET;
socketaddr.sin_addr.s_addr = INADDR_ANY;
socketaddr.sin_port = htons(PORT_ADDR);
if (bind(servsocket,(LPSOCKADDR)&socketaddr,sizeof(socketaddr)) == SOCKET_ERROR)
{
printf("Нет связи с портом!!!");
exit(1);
}
else printf("Успешное установление связи с портом\n");
}
void CloseScoket()
{
closesocket(servsocket);
}
HWND GetConsoleHWND()
{
SetConsoleTitle(NAME_SERVER_SOCKET);
hwndc=FindWindow(NULL, NAME_SERVER_SOCKET);
if (hwndc==NULL)
{
printf("Ошибка получения хендла окна!!!");
exit(0);
}
return hwndc;
}
void LinkWindowScoket()
{
int Errors;
Errors=WSAAsyncSelect(servsocket,GetConsoleHWND(),
WM_SERVER_ACCEPT, FD_ACCEPT||FD_READ||FD_WRITE||FD_CONNECT);
if (Errors == SOCKET_ERROR)
{
printf("Ошибка соединения сокета с окном !!! \n");
exit(1);
}
else printf("Успешное соединение сокета с окном! \n");
}
void WaitSocket()
{
int Errors;
Errors=listen(servsocket,QUEUE_SIZE);
if ( Errors == SOCKET_ERROR)
{
printf(" Ошибка!!! НЕТ ОЖИДАНИЯ СОЕДИНЕНИЯ !!! \n");
exit(1);
}
else printf("УСПЕХ !!!!!!! \n");
printf("Ожидаем соединение \n");
}
СОКЕТ НЕ РАБОТАЕТ:-(
Всем доброго времени! Почему не работает? Все проверки оканчиваются успехом, но при попытки подключения не выводит К нам присоединились!!! :-), а зависает!
А откуда этот пример, если не секрет? Вообще-то, соединения принимают не через GetMessage(), а через accept().
Код:
void LinkWindowScoket()
{
int Errors;
Errors=WSAAsyncSelect(servsocket,GetConsoleHWND(),
WM_SERVER_ACCEPT, FD_ACCEPT||FD_READ||FD_WRITE||FD_CONNECT);
if (Errors == SOCKET_ERROR)
{
printf("Ошибка соединения сокета с окном !!! \n");
exit(1);
}
else printf("Успешное соединение сокета с окном! \n");
}
{
int Errors;
Errors=WSAAsyncSelect(servsocket,GetConsoleHWND(),
WM_SERVER_ACCEPT, FD_ACCEPT||FD_READ||FD_WRITE||FD_CONNECT);
if (Errors == SOCKET_ERROR)
{
printf("Ошибка соединения сокета с окном !!! \n");
exit(1);
}
else printf("Успешное соединение сокета с окном! \n");
}
Ну у вас же консольное окно, здесь вы обычным GetMessage() не обойдетесь. Делайте полноценное скрытое окно, и будет вам счастье.
http://forum.codeby.net/topic5578.html Мне и самому кажется, что WM_SERVER_ACCEPT куда-то ни туда шлется.:confused:
а консоль вообще не может принимать оконные собщения? Я нашел примеры только с GetMessage(). Люди пишут, что у них все работает.
Цитата: Павел13
Люди пишут, что у них все работает
Почитайте внимательно, там не о консоли речь идет.
Цитата:
делаешь обычное консольное приложение с точкой входа в виде ф-ии main ... и в теле этой функции создаешь окно
Вот что там предлагается. Собственно, о чем я вам и говорю.
Да я уже перечитал, я действительно неправильно понял. Не хотелось бы создовать окошко:( Попробую реализовать через хук сообщений WH_GETMESSAGE. Alexander92 Вам СПАСИБО!
Собственно, вопрос даже еще проще: почему не хотите реализовать через обычный accept()? Для консольных приложений это совершенно стандартная техника.
Да секрета нет ни какого. Просто ту статью Каев Артем как то писал писал, потом бах резко перешел и начал писать с MFC, а я только только начал вникать в сетевое программирование. Думаю, что раз начал уже консольное писать, то и продолжу. Честно сказать для меня новость, что консольное окно не получает оконных сообщений. Хотя меня насторожило, что Spy++ выдавал ошибку, что доступ к потоку сообщения данного окна запрещен. accept() у него вообще не упоминался. Я немного раньше читал про данную функцию, это же функция Беркли? Я думал они только для Юниксойдов. Сейчас внимательнее изучу. Вообще это программа не сама цель. Она будет подъопытной. Основную прогу хочу реализовать на ФАСМЕ. Вообщем цель такая: сервер будет запрашивать пароль и вслучае успеха отправлять HTML-страницу клиенту(браузеру). Программа на ФАСМ должна будет запустися на стороне клиента, переполнить буфер сервера и выполнить свой код на сервере. Это будет простой пример, но для новичка подойдет. Я непрофессиональный программист, просто хобби. Изучаю языки программирования, сети, ОСи, безопасность,железо, да вообщем всё интерсно, что связано с компами! Ну вроде есть небольшие продвижения в данных направлениях:)
Цитата: Alexander92
А откуда этот пример, если не секрет?
И еще почему спросили? Я сильно ужастно написал код?
Цитата:
это же функция Беркли?
Да, это оттуда.
И еще почему спросили? Я сильно ужастно написал код?
[/QUOTE]
Потому что я увидел, что он нерабочий. Вот и спросил, это ваш код или вас обманул автор какой-то не очень грамотной книги.