Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

СОКЕТ НЕ РАБОТАЕТ:-(

60K
09 июля 2011 года
Павел13
11 / / 30.09.2010
Всем доброго времени! Почему не работает? Все проверки оканчиваются успехом, но при попытки подключения не выводит К нам присоединились!!! :-), а зависает!
Код:
#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");
}
278
09 июля 2011 года
Alexander92
1.1K / / 04.08.2008
А откуда этот пример, если не секрет? Вообще-то, соединения принимают не через GetMessage(), а через accept().
60K
09 июля 2011 года
Павел13
11 / / 30.09.2010
Пример составил сам по статье Артема Каева. GetMessage() отлавливет сообщения WM_SERVER_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");
}
278
09 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Ну у вас же консольное окно, здесь вы обычным GetMessage() не обойдетесь. Делайте полноценное скрытое окно, и будет вам счастье.
60K
09 июля 2011 года
Павел13
11 / / 30.09.2010
а консоль вообще не может принимать оконные собщения? Я нашел примеры только с GetMessage(). Люди пишут, что у них все работает.http://forum.codeby.net/topic5578.html Мне и самому кажется, что WM_SERVER_ACCEPT куда-то ни туда шлется.:confused:
278
09 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Просто так оконные сообщения для консоли вы не обработаете. Делайте полноценный Win32-проект.

Цитата: Павел13
Люди пишут, что у них все работает


Почитайте внимательно, там не о консоли речь идет.

Цитата:

делаешь обычное консольное приложение с точкой входа в виде ф-ии main ... и в теле этой функции создаешь окно


Вот что там предлагается. Собственно, о чем я вам и говорю.

60K
09 июля 2011 года
Павел13
11 / / 30.09.2010
Да я уже перечитал, я действительно неправильно понял. Не хотелось бы создовать окошко:( Попробую реализовать через хук сообщений WH_GETMESSAGE. Alexander92 Вам СПАСИБО!
278
09 июля 2011 года
Alexander92
1.1K / / 04.08.2008
А почему не хотите создавать окно, если не секрет? Кому мешает невидимое окно? Для таких целей специально существует окно вида HWND_MESSAGE - которое занимается только обработкой сообщений.

Собственно, вопрос даже еще проще: почему не хотите реализовать через обычный accept()? Для консольных приложений это совершенно стандартная техника.
60K
09 июля 2011 года
Павел13
11 / / 30.09.2010
Да секрета нет ни какого. Просто ту статью Каев Артем как то писал писал, потом бах резко перешел и начал писать с MFC, а я только только начал вникать в сетевое программирование. Думаю, что раз начал уже консольное писать, то и продолжу. Честно сказать для меня новость, что консольное окно не получает оконных сообщений. Хотя меня насторожило, что Spy++ выдавал ошибку, что доступ к потоку сообщения данного окна запрещен. accept() у него вообще не упоминался. Я немного раньше читал про данную функцию, это же функция Беркли? Я думал они только для Юниксойдов. Сейчас внимательнее изучу. Вообще это программа не сама цель. Она будет подъопытной. Основную прогу хочу реализовать на ФАСМЕ. Вообщем цель такая: сервер будет запрашивать пароль и вслучае успеха отправлять HTML-страницу клиенту(браузеру). Программа на ФАСМ должна будет запустися на стороне клиента, переполнить буфер сервера и выполнить свой код на сервере. Это будет простой пример, но для новичка подойдет. Я непрофессиональный программист, просто хобби. Изучаю языки программирования, сети, ОСи, безопасность,железо, да вообщем всё интерсно, что связано с компами! Ну вроде есть небольшие продвижения в данных направлениях:)
60K
09 июля 2011 года
Павел13
11 / / 30.09.2010
Цитата: Alexander92
А откуда этот пример, если не секрет?

И еще почему спросили? Я сильно ужастно написал код?

278
09 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Честно говоря, не понимаю абсолютно, зачем вам фасм. Задачу вашу я понял, но с методами решения, сказать честно, не согласен категорически.

Цитата:

это же функция Беркли?


Да, это оттуда.

278
10 июля 2011 года
Alexander92
1.1K / / 04.08.2008
[QUOTE=Павел13]
И еще почему спросили? Я сильно ужастно написал код?
[/QUOTE]
Потому что я увидел, что он нерабочий. Вот и спросил, это ваш код или вас обманул автор какой-то не очень грамотной книги.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог