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);
}