Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Winapi и socket 
V
    Опции темы
bass
Дата 17.6.2012, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: нет
Всего: 2



Что то я опять поднакосячил..... Решел написать сервер на WinApi но код получился не работоспособным....... И немогу понять где ошибка..... Раньше это был сетевой клиент, который прекрасно работал...... А в данной ситуации не одно событие в оконную процедуру не приходит... Или как всгда что то я упустил..... Заранее спасибо.....

Забыл что самое странное коннект проходит.....

Код



DWORD WINAPI CreateWindowKlient(void *Param)
{
HINSTANCE hInstance=GetModuleHandle(0);
//=======================запускаем окно клиента ============================

//==============================================================================



//===================================================================
    WNDCLASSEX wClass;
    ZeroMemory(&wClass,sizeof(WNDCLASSEX));
    wClass.cbClsExtra=NULL;
    wClass.cbSize=sizeof(WNDCLASSEX);
    wClass.cbWndExtra=NULL;
    wClass.hbrBackground=(HBRUSH)COLOR_WINDOW;
    wClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    wClass.hIcon=NULL;
    wClass.hIconSm=NULL;
      wClass.hInstance=hInstance;
    wClass.lpfnWndProc=(WNDPROC)WinProcNetwork;
    wClass.lpszClassName="Window Class";
    wClass.lpszMenuName=NULL;
    wClass.style=CS_HREDRAW|CS_VREDRAW;

    if(!RegisterClassEx(&wClass))
    {
    }

    hWndConnect=CreateWindowEx(NULL,"Window Class","Windows Async Client",WS_OVERLAPPEDWINDOW,200,200,640,480,NULL,    NULL,hInstance,NULL);

    if(!hWndConnect)
    {}

        ShowWindow(hWndConnect,nShowCmd);

    MSG msg;
    ZeroMemory(&msg,sizeof(MSG));


//===================Производим открытие порта..======================

// Set up Winsock
WSADATA WsaDat;
DWORD NetworkResult=WSAStartup(MAKEWORD(2,2),&WsaDat);
if(NetworkResult!=0)
{return 0;}



    SOCKET sServerListen, sClient;
    struct sockaddr_in localaddr, clientaddr;
    HANDLE hThread;
    DWORD dwThreadId;
    int iSize;

    sServerListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    if (sServerListen == SOCKET_ERROR)
    {
        MessageBox(0, "Can't load WinSock", "Error", 0);
        return 0;
    }

    ULONG ulBlock;
    ulBlock = 1;
    if (ioctlsocket(sServerListen, FIONBIO, &ulBlock) == SOCKET_ERROR)
    {
        return 0;
    }

    localaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    localaddr.sin_family = AF_INET;
    localaddr.sin_port = htons(StrToInt(Form1->Edit1->Text));

    if (bind(sServerListen, (struct sockaddr *)&localaddr, 
        sizeof(localaddr)) == SOCKET_ERROR)
    {
        MessageBox(0, "Can't bind", "Error", 0);
        return 1;
    }
    
    WSAAsyncSelect(sServerListen,hWndConnect, WM_USER+1, FD_ACCEPT);
    listen(sServerListen, 4);




//=====================================================================

    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0 ;
}


LRESULT CALLBACK WinProcNetwork(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
SOCKET ClientSocket;
    switch(msg)
    {
        case WM_CREATE:
        {break;}
        case WM_DESTROY:
        {
            PostQuitMessage(0);
            shutdown(wParam,SD_BOTH);
            closesocket(wParam);
            WSACleanup();
            return 0;
        }

        case WM_SOCKET:
        {
            if(WSAGETSELECTERROR(lParam))
            {
                        shutdown(wParam,SD_BOTH);
                        return DefWindowProc(hWnd,msg,wParam,lParam);
                        }

            switch(WSAGETSELECTEVENT(lParam))
            {


                               case FD_CONNECT :
                                {
                                ClientSocket = accept(wParam, 0, 0);
                    WSAAsyncSelect(ClientSocket,hWndConnect, WM_USER+1,FD_READ | FD_WRITE | FD_CLOSE);
                                break;}

                case FD_READ:
                        {break;}

                case FD_CLOSE:
                {closesocket(wParam);break;}
            }
               }
    }

    return DefWindowProc(hWnd,msg,wParam,lParam);
}





void __fastcall TForm1::Button3Click(TObject *Sender)
{
DWORD GOid;
HANDLE Thread1Network = CreateThread(NULL,0,CreateWindowKlient,0,0,&GOid);
}
//---------------------------------------------------------------------------



Это сообщение отредактировал(а) bass - 17.6.2012, 13:41
PM MAIL   Вверх
Dem_max
Дата 17.6.2012, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: нет
Всего: 39



если что то ты вообще не ловишь этого события сам.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
bass
Дата 17.6.2012, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: нет
Всего: 2



Цитата(Dem_max @ 17.6.2012,  13:59)
если что то ты вообще не ловишь этого события сам.

Я ставлю брек поинт в отладчике..... Лень мессадж боксы для тестов ставить.....
Даже сейчас вставил мессадж в событие коннект, не срабатывает.......

Это сообщение отредактировал(а) bass - 17.6.2012, 14:08
PM MAIL   Вверх
feodorv
Дата 17.6.2012, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



А что такое WM_SOCKET?

Цитата(bass @  17.6.2012,  14:39 Найти цитируемый пост)
            shutdown(wParam,SD_BOTH);
            closesocket(wParam);

Что здесь делает wParam?

Зачем вообще оконная процедура? Чтобы сетевые события ловить?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Dem_max
Дата 18.6.2012, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: нет
Всего: 39



Цитата

А что такое WM_SOCKET?

какое то сообщение, и только оно тут само по себе и ни при каких событиях возникнуть не может, если только другой процесс не пошлет это сообщение 


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
feodorv
Дата 18.6.2012, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Цитата(Dem_max @  18.6.2012,  04:00 Найти цитируемый пост)
какое то сообщение

Но вот какое?

Цитата(bass @  17.6.2012,  14:39 Найти цитируемый пост)
    WSAAsyncSelect(sServerListen,hWndConnect, WM_USER+1, FD_ACCEPT);

Здесь привязка идёт к WM_USER+1. Если WM_SOCKET не совпадает с WM_USER+1, то о чём вообще может идти речь?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
bass
Дата 19.6.2012, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: нет
Всего: 2



Приношу извинения отладчик почему то не останавливался на брекпоинте......
#define WM_SOCKET        104
В клиенте было так и все работало с такой оконной процедурой......
Поэтому и встал в тупик почему не работает.......
Посмотрев примеры кода сервера, запустил.....
И сейчас понял свою ошибку.......
В клиенте было вот так..
WSAAsyncSelect(Socket,hWndConnect,WM_SOCKET,(FD_CLOSE|FD_READ|FD_CONNECT))
...)))))))

Это сообщение отредактировал(а) bass - 19.6.2012, 02:37
PM MAIL   Вверх
feodorv
Дата 19.6.2012, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Ну а сейчас-то работает? Вопрос решён?)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
NYX
Дата 1.8.2012, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 9.1.2007
Где: Россия, Москва

Репутация: нет
Всего: нет



Отладчик может не работать в релиз версии.
--------------------
'long long long' is too long for GC
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.