Wysłanie przez serwer liczby po podłączeniu się klienta

0

Witam
piszę program serwera i klienta. Serwer po połączeniu się klienta powinien mu wysłać liczbę
kawałek kodu serwera

ClientSocket = accept(ListenSocket, NULL, NULL);
	if (ClientSocket == INVALID_SOCKET) {
		printf("accept failed with error: %d\n", WSAGetLastError());
		closesocket(ListenSocket);
		WSACleanup();
		return 1;
	}
	// No longer need server socket
	closesocket(ListenSocket);

	//wysłanine liczby z serwera
	numberToSend = htonl(numberToSend);
	std::clog << "wysy";
	iSendResult = send(ClientSocket, (const char*)&numberToSend, iResult, 0);
	if (iSendResult == SOCKET_ERROR) {
		printf("send failed with error: %d\n", WSAGetLastError());
		closesocket(ClientSocket);
		WSACleanup();
		return 1;
	}

kod klienta do odebrania liczby po połączniu


	if (ConnectSocket == INVALID_SOCKET) {
		printf("Unable to connect to server!\n");
		WSACleanup();
		return 1;
	}
	std::clog << "polaczenie nawiazane\n";
	//odebranie liczby z serwera
	iResult = 2;
	do {
		iResult = recv(ConnectSocket, (char*)&recvNumber, sizeof(float), 0);
		if (iResult > 0)
			printf("Bytes received: %d\n", iResult);
		else if (iResult == 0)
			printf("Connection closed\n");
		else
			printf("recv failed with error: %d\n", WSAGetLastError());

	} while (iResult > 0);

I problem jest taki że klient łączy się z serwerem, serwer wysyła liczbę ale klient jej nie otrzymuje, nie wiem co robię nie tak, to moje początki w poznawaniu socketów, ktoś wie jak mi pomóc?

0

a czemu w kodzie serwera wywołujesz metodę closesocket(ListenSocket); przed wysłaniem wiadomości?

0

Skoro już klient połączył się to już nie będę oczekiwał następnego klienta dlatego zamykam.

0

Co racja to racja, a próbowałeś wysłać mu na sztywno wpisaną wartość np. 0x31, bo przesyłasz tablicę bajtów, więc możesz wysłać tablicę jednoelementową, a dla klienta napisać kod, który będzie miał buffor 512 elementowy i przekazujesz go do metody recv, a jako argument len przekazujesz 1, jak to zadziała to potem bawisz się dalej.

Może problem leży w kodzie serwera, bo jako 3 argument w metodzie send przekazujesz rozmiar przesyłanej wiadomości, a Ty przekazujesz iResult, a czym jest iResult w kodzie serwera?

0

Problem rozwiązałem
kod klienta

if (ConnectSocket == INVALID_SOCKET) {
		printf("Unable to connect to server!\n");
		WSACleanup();
		return 1;
	}
	std::clog << "Conneted\n";
	bool isRecived = false;
	do {
		std::clog << "Waiting for number\n";
		iResult = recv(ConnectSocket, (char*)&recvNumber, sizeof(long long), 0);
		if (iResult > 0) {
			printf("Bytes received: %d\n", iResult);
			printf("Number received: %d\n", ntohl(recvNumber));
			isRecived = true;
		}
		else if (iResult == 0)
			printf("Connection closed\n");
		else
			printf("recv failed with error: %d\n", WSAGetLastError());

	} while (isRecived == 0);

kod serwera

ClientSocket = accept(ListenSocket, NULL, NULL);
	if (ClientSocket == INVALID_SOCKET) {
		printf("accept failed with error: %d\n", WSAGetLastError());
		closesocket(ListenSocket);
		WSACleanup();
		return 1;
	}
	// No longer need server socket
	closesocket(ListenSocket);
	numberToSend = htonl(numberToSend);
	std::clog << "Sending numbery\n";
	iSendResult = send(ClientSocket, (const char*)&numberToSend, sizeof(long long), 0);
	if (iSendResult == SOCKET_ERROR) {
		printf("send failed with error: %d\n", WSAGetLastError());
		closesocket(ClientSocket);
		WSACleanup();
		return 1;
	}

Tam była mała mała pomyłka a szukałem jej naprawdę długo, kod troszkę zmieniony względem poprzedniego ale te fragmenty są poprawne i działają tak jak chcę :)

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