ďťż
 
 
   funkcja bind - mieszanie winsock i winapi
 
 

Tematy

 
    
 

 

 

 

funkcja bind - mieszanie winsock i winapi





bagsiur - 12-07-2009 23:11
Ciekawe czy na forum Debiana przewijał się wątek winapi (taka mała prowokacja). Wrzucam ten temat na każde mądrzejsze forum na jakim siedzę kto wie, może jakiś programista zajrzy na forum Debiana (myślę, że większość developerów korzysta z Linuksa). Więc tak:

Witam wszystkich. Piszę małą aplikację z wykorzystaniem winsok i winapi. Jeśli chodzi o mieszanie winsok z winapi to jest to moje pierwsze podejście, (wcześniej było tylko Delphi, i wersje konsolowe, pod różne systemy) i już na samym początku mam problem z funkcją bind, a dodam że przed podejściem do winapi stworzyłem sobie serwer w wersji konsolowej i było wszystko dobrze. Problem jest taki że przy funkcji bind program zwraca błąd. Podejrzewam, że dla zawodowców rozwiązanie będzie proste, dlatego prosiłbym nie tylko o wskazanie błędu ale też o wytłumaczenie co gdzie jak i dlaczego.

Wiem też, że normalnie funkcja bind() zwraca błąd jeśli spróbujemy związać gniazdo z adresem i portem, który jest aktualnie w użyciu, ale u mnie używany port jest czyściutki (sprawdzałem scanportem).

Poniżej zamieszczam kod: #include <string>
#include <windows.h>
#include <winsock2.h>

// nazwa klasy okna i zmienne
std::string aplikacja = "program";
WSADATA wsaData;
sockaddr_in local;
SOCKET cli, nas=socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
char buffer[2048];

// ------------------- procedura zdarzeniowa okna ------------------------
// Tu sa głupoty wezme się za to jak się uporam z bindem
LRESULT CALLBACK WindowEventProc(HWND hWindow, UINT uMsg,
                                WPARAM wParam, LPARAM lParam){
    switch (uMsg){
        case WM_USER:
              switch (WSAGETSELECTEVENT(lParam)){
              case FD_ACCEPT:
                    cli=accept(nas, NULL, NULL);
                    MessageBox(NULL,"sxcvf","wger",MB_OK);
              break;   
              case FD_READ:
                    recv(cli, buffer, 2048, 0);
                    MessageBox(NULL,"sdfsfs","ref",MB_OK);
              break;
                   
                      }
        break;
        case WM_DESTROY: PostQuitMessage (0);  // kończymy program
        return 0;
        }
return DefWindowProc(hWindow, uMsg, wParam, lParam);
}

// ------------------------funkcja WinMain() ----------------------------

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow){
 
                      /* rejestrujemy klasę okna */
                      WNDCLASSEX KlasaOkna;
                      // wypełniamy strukturę WNDCLASSEX
                      ZeroMemory (&KlasaOkna, sizeof(WNDCLASSEX));
                      KlasaOkna.cbSize = sizeof(WNDCLASSEX);
                      KlasaOkna.hInstance = hInstance;
                      KlasaOkna.lpfnWndProc = WindowEventProc;
                      KlasaOkna.lpszClassName = aplikacja.c_str();
                      KlasaOkna.hCursor = LoadCursor(NULL, IDC_ARROW);
                      KlasaOkna.hIcon = LoadIcon(NULL, IDI_APPLICATION);
                      KlasaOkna.hbrBackground = (HBRUSH) COLOR_WINDOW;
                      KlasaOkna.style = CS_SAVEBITS;
                      // rejestrujemy klasę okna
                      RegisterClassEx (&KlasaOkna);

/* tworzymy okno */
// tworzymy okno funkcją CreateWindowEx

HWND oknoGlowne;
oknoGlowne = CreateWindowEx(NULL, // rozszerzony styl
                      aplikacja.c_str(), // klasa okna
                      "bagsiur aplikations", // tekst na p. tytułu
                      WS_OVERLAPPEDWINDOW, // styl okna
                      CW_USEDEFAULT, // współrzędna X
                      CW_USEDEFAULT, // współrzędna Y
                      300, // szerokość
                      150, // wysokość
                      NULL, // okno nadrzędne
                      NULL, // menu
                      hInstance, // instancjs aplikacji
                      NULL); // dodatkowe dane

// pokazujemy nasze okno
ShowWindow (oknoGlowne, nCmdShow); 
 
// ------------------------winsock --------------------------------- 

if (WSAStartup(MAKEWORD(2,2), &wsaData)!= 0 ){
MessageBox(oknoGlowne,"error WSA","ERROR",MB_OK);
WSACleanup();
}

memset(&local, 0, sizeof(local));
local.sin_addr.s_addr = htonl(INADDR_ANY);
local.sin_family = AF_INET;
local.sin_port = htons(1024);

if(bind(nas, (struct sockaddr*)&local, sizeof(local))== SOCKET_ERROR){
MessageBox(oknoGlowne,"bind","error",MB_OK);
WSACleanup();
}
if(listen(nas, SOMAXCONN)==SOCKET_ERROR){
MessageBox(oknoGlowne,"error listen","ERROR",MB_OK);
WSACleanup();
}
WSAAsyncSelect(nas,oknoGlowne,WM_USER,FD_ACCEPT|FD_CONNECT|FD_READ|FD_WRITE);               

/* pętla komunikatów */
MSG msgKomunikat;

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

}

// zwracamy kod wyjścia
return static_cast<int>(msgKomunikat.wParam);
} Za pomoc z góry dziękuję.



ponton - 28-07-2009 19:44
Samo stwierdzenie "jest błąd" nie wystarcza, musisz sprawdzić "jaki błąd" to jest. Poza tym, mało kto jest w stanie sam skompilować to i sprawdzić.



giaur - 30-07-2009 22:01
Sprawdź co zwraca WSAStartup, więcej informacji tu: http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx



bagsiur - 18-08-2009 21:59
Przepraszam za brak odpowiedzi, ale błąd już dawno rozwiązany, program napisany a jak będę kiedyś siedział na Windowsie to opiszę co było nie tak.
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • minister.pev.pl

  •  

     


     

     
    Copyright 2003. MĂłj serwis