funkcja bind - mieszanie winsock i winapi

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
bagsiur
Beginner
Posty: 132
Rejestracja: 01 czerwca 2008, 22:12
Lokalizacja: Będzin

funkcja bind - mieszanie winsock i winapi

Post autor: bagsiur »

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:

Kod: Zaznacz cały

#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
Beginner
Posty: 406
Rejestracja: 24 stycznia 2007, 01:40
Lokalizacja: Kalisz/Wroc³aw

Post autor: ponton »

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
Member
Posty: 1915
Rejestracja: 25 maja 2007, 22:16

Post autor: giaur »

Sprawdź co zwraca WSAStartup, więcej informacji tu: http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Awatar użytkownika
bagsiur
Beginner
Posty: 132
Rejestracja: 01 czerwca 2008, 22:12
Lokalizacja: Będzin

Post autor: bagsiur »

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