WinSock na win7 x64

0

Kiedy kompiluję jakiś kod z tutoriala:

WORD version = MAKEWORD(2,2);   
	WSADATA wsaData;       // nasze WSA
	if(WSAStartup(version, &wsaData) != 0) // tworzymy WSA
	{

  		cout << "Blad inicjalizacji WSA" << endl;
  		WSACleanup(); // usuwamy WSA
  		return 1;
	}
	if( LOBYTE(wsaData.wVersion) != 2 || 
    	HIBYTE(wsaData.wVersion) != 2 )
	{
  		cout << "Nieprawidlowa wersja" << endl;
  		WSACleanup(); // usuwamy WSA
  		return 1;
	}


	SOCKET sListen, // nasze "ucho"
    sClient; // nasz klient 

	sListen = socket( AF_INET, SOCK_STREAM, IPPROTO_IP);
	if( sListen == SOCKET_ERROR ) // sprawdzamy czy sie ud
	{
  		cout << "Nie mozna stworzyc ucha" << endl;
  		WSACleanup();
  		return 1;
	}

	sockaddr_in local; // ustawienia serwera
	int port = 6789; // nasz przydowy port
  
	memset(&local, 0, sizeof(local)); 
	local.sin_addr.s_addr = htonl(INADDR_ANY); 
	local.sin_family = AF_INET; // korzystamy z TCP/IP
	local.sin_port = htons((u_short)port); // wybieramy port
 
	if (bind(sListen, (sockaddr*)&local, sizeof(local)) == SOCKET_ERROR)
	{
 		 cout << "Bind zakonczony porazka" << endl;
  		 closesocket(sListen);
 		 WSACleanup();
         return 1;
	}

	if(listen(sListen, SOMAXCONN) == SOCKET_ERROR) 
	{
  		cout << "Operacja dodania sluchu nieudana" << endl;
  		closesocket(sListen);
  		WSACleanup();
 		 return 1;
	}

	sockaddr_in client;
	sClient = accept (sListen, (sockaddr*)&client, (int*) sizeof(client));

	Sleep(10000);
 
	if(sClient == INVALID_SOCKET)
	{
  		cout << "Niepoprawne polaczenie!" << endl;
 		closesocket(sClient);
 		closesocket(sListen);
  		WSACleanup();
  		return 1;
	}

który wcześniej działał na XP x32, na systemie jak w tytule wyświetla "Niepoprawne polaczenie".
Co z tym nie tak?

0

Zapomniałem dodać, że nie działa ani w konfiguracji win32, ani x64.

0

Nie wiem o co chodzi, ale napisałem sam wszystko od początku i działa.
Tamten kod, który podałem na pewno działał na XP.

0

sClient = accept (sListen, (sockaddr*)&client, (int*) sizeof(client));

Jak to się ma do dokumentacji? Jak na XP działa to przez przypadek...

0

Ostatni parametr to in/out, działa na zasadzie "mam tyle bajtów na ip klienta, powiedz ile trzeba":

int cchAddr = sizeof(client);
sClient = accept (sListen, (sockaddr*)&client, &cchAddr);

Jeżeli nie potrzebujesz ip klienta to napisz accept(sListen,0,0). Ale jeżeli podasz wszystkie parametry, to po wartości cchAddr poznasz która wersja sockaddr została zwrócona, sprawdzając sizeof każdej znanej wersji struktury sockaddr = sockaddr_in, sockaddr_irda, SOCKADDR_IN6...

1 użytkowników online, w tym zalogowanych: 0, gości: 1