|
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.pldoc.pisz.plpdf.pisz.plminister.pev.pl
|