funkcja bind - mieszanie winsock i winapi
: 12 lipca 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:
Za pomoc z góry dziękuję.
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);
}