Oppure

Loading
01/03/22 18:03
Gemini
Salve a tutti non so se il titolo va bene ma non sapevo come scrivere XD in ogni caso ho un problemino che non riesco a capire dove sbaglio in pratica ho creato un server e client con winsock2 la connessione funziona ma quando ricevo un messaggio dal alla fine della stringa mi escono simboli strani.... qualcuno sa aiutarmi vi mostro il codice e alcuni screen

CLASSE NETWORK

NETWORK.h

#include <winsock2.h>


#pragma comment(lib, "ws2_32.lib")


class Network
{
    public:

    //Metodi Connessione
    int ServerTCP();
    int ClientTCP();

    //Metodi Invio/Ricezione dati
    void socketSend(char *sendbuf);
    char* socketRecv();
    



    private:
    //Variabili Private
    WSAData wsaData;
    WORD DllVersion = MAKEWORD(2, 1);

    SOCKET s_socket;
    SOCKET a_socket;

    int c;

    struct sockaddr_in sokAddr_in;
    struct sockaddr_in client;

    //Metodi privati
    int initSocket();
    int createSocket(int type);
    bool closeSocket();
    int bindSocket();
    int acceptSocket();
    int connectSocket();
};



NETWORK.CPP
#include "Network.h"
#include <stdio.h>

//===============================================//
//=                ServerTCP                    =//
//===============================================//
int Network::ServerTCP()
{
    if(initSocket() != 0)
    {
        printf("Errore durante ServerTCP() -- initSocket()\n");
        return -1;
    }
    if(createSocket(0) != 0)
    {
        printf("Errore durante ServerTCP() -- createSocket()\n");
        return -1;
    }
    if(bindSocket() != 0)
    {
        printf("Errore durante ServerTCP() -- bindSocket()\n");
        return -1;
    }
    if(acceptSocket() != 0)
    {
        printf("Errore durante ServerTCP() -- acceptSocket()\n");
        return -1;
    }
    return 0;
}

//===============================================//
//=                ClientTCP                    =//
//===============================================//
int Network::ClientTCP()
{
    if(initSocket() != 0)
    {
        printf("Errore durante ClientTCP() -- initSocket()\n");
        return -1;
    }
    if(createSocket(1) != 0)
    {
        printf("Errore durante ClientTCP() -- createSocket()\n");
        return -1;
    }
    while(connectSocket() != 0)
    {
        printf("Errore durante ClientTCP() -- connectSocket()\n");
        //return -1;
    }

    return 0;
}


//===============================================//
//=                socketSend               	=//
//===============================================//
void Network::socketSend(char *sendbuf)
{
	int sendResult;
	sendResult = send(a_socket, sendbuf,(int)strlen(sendbuf), 0);
	if(sendResult == SOCKET_ERROR)
	{
		printf("socketSend() Fallito %d\n",WSAGetLastError());
		closeSocket();
		return;
	}

	printf("Byte invitati %d\n",sendResult);
}


//===============================================//
//=                socketRecv             		=//
//===============================================//
char* Network::socketRecv()
{
	int recvResult;
	char recvbuf[1024];
	int recvbuflen = 1024;
	char* tmp = recvbuf;

	do
	{
		
		recvResult = recv(s_socket,recvbuf,recvbuflen,0);
		if(recvResult > 0)
		{
			printf("byte ricevuti: %d\n", recvResult);
			//printf("%s\n",recvbuf);
			return tmp;
		}
		else if(recvResult == 0)
		{
			printf("Connessione chiusa\n");
			closeSocket();
			return NULL;
		}
		else
		{
			printf("Fallito socketRecv() con errore %d\n",WSAGetLastError());
			return NULL;
		}
			
	} while (recvResult > 0);

}





//===============================================//
//=                initSocket                   =//
//===============================================//
int Network::initSocket()
{
    if (WSAStartup(DllVersion, &wsaData) != 0)
	{

		printf("Fallito initSocket. Errore: %d", WSAGetLastError());
		return -1;
	}

    //Da cancellare 
	//server solo per vedere se &#65533; andato tutto bene
	printf("initSocket OK!\n");

	return 0;
}

//===============================================//
//=                createSocket                 =//
//===============================================//
int Network::createSocket(int type)
{
    if ((s_socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
	{

		printf("Fallito createSocket. Errore: %d", WSAGetLastError());
		return -1;

	}
    if (type == 0)//SERVER
	{
		//Prepare the sockaddr_in structure
		sokAddr_in.sin_family = AF_INET;
		sokAddr_in.sin_addr.s_addr = INADDR_ANY;
		sokAddr_in.sin_port = htons(8888);
	}
	else if (type == 1)//CLIENT
	{
		//Prepare the sockaddr_in structure
		sokAddr_in.sin_family = AF_INET;
		sokAddr_in.sin_addr.s_addr = inet_addr("127.0.0.1");
		//server.sin_addr.s_addr = inet_pton(AF_INET,"127.0.0.1",&server.sin_addr);
		sokAddr_in.sin_port = htons(8888);
	}

    //Da cancellare 
	//server solo per vedere se &#65533; andato tutto bene
	printf("createSocket OK!\n");


	return 0;
}

//===============================================//
//=                closeSocket                  =//
//===============================================//
bool Network::closeSocket()
{
	closesocket(s_socket);
	WSACleanup();

	return true;
}

//===============================================//
//=                bindSocket                   =//
//===============================================//
int Network::bindSocket()
{
	if (bind(s_socket, (struct sockaddr*)&sokAddr_in, sizeof(sokAddr_in)) == SOCKET_ERROR)
	{
		printf("Fallito bindSocket. Errore: %d", WSAGetLastError());
		return -1;
	}

	//Listen 
	listen(s_socket, 3);


	//Da cancellare 
	//server solo per vedere se &#65533; andato tutto bene
	printf("bindSocket OK!\n");

	return 0;
}

//===============================================//
//=                acceptSocket                   =//
//===============================================//
int Network::acceptSocket()
{
	c = sizeof(struct sockaddr_in);
	a_socket = accept(s_socket, (struct sockaddr*)&client, &c);
	if (a_socket == INVALID_SOCKET)
	{
		printf("Fallito acceptSocket. Errore: %d", WSAGetLastError());
		return -1;
	}


	//Da cancellare 
	//server solo per vedere se &#65533; andato tutto bene
	printf("acceptSocket OK!\n");

	return 0;
}

//===============================================//
//=                connectSocket                =//
//===============================================//
int Network::connectSocket()
{
	if (connect(s_socket, (struct sockaddr*)&sokAddr_in, sizeof(sokAddr_in)) < 0)
	{
		printf("Fallito connectSocket. Errore: %d\n", WSAGetLastError());
		return -1;
	}

	//Da cancellare 
	//server solo per vedere se &#65533; andato tutto bene
	printf("connectSocket OK!\n");
	return 0;
}



CLIENT.CPP
#include "../../Utils/Network.h"
#include <stdio.h>

int main()
{
    Network networks;

    
     if(networks.ClientTCP() != 0)
    {
        printf("Errore durante ClientTCP()\n");
        return -1;
    }

    //
    //Se il client è connesso
    //

    printf("Connesso!\n");

    while(true)
    {
        char* tmp = networks.socketRecv();
        printf("%s\n",tmp);
         //networks.socketRecv();
         
         
       
    }

    
   

    return 0;
}



SERVER.CPP
#include "../../Utils/Network.h"
#include <stdio.h>

int main()
{
    Network networks;

    

   
    if(networks.ServerTCP() != 0)
    {
        printf("Errore durante ServerTCP()\n");
        return -1;
    }

    //
    //Se il client è connesso
    //
    while(true)
    {
        char ok[1024];
        char *msg;
        printf("Connesso!\n");
        scanf("%s",ok);
        msg = ok;
        networks.socketSend(msg);
    }
    


    return 0;
}



01/03/22 18:42
nessuno
Dove visualizzi il messaggio "byte ricevuti"?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
01/03/22 19:26
Gemini
ho risolto modificando la funzione in questo modo
//===============================================//
//=                socketRecv           		=//
//===============================================//
char* Network::socketRecv(int socketType, int type)
{
	int recvResult;
	char recvbuf[1024];
	int recvbuflen = 1024;
	char* tmp = recvbuf;

	do
	{
		
		recvResult = recv(s_socket,recvbuf,recvbuflen,0);
		

		if(recvResult > 0)
		{
			return tmp;
		}
		else if(recvResult == 0)
		{
			printf("Connessione chiusa\n");
			closeSocket();
			return NULL;
		}
		else
		{
			printf("Fallito socketRecv() con errore %d\n",WSAGetLastError());
			
		}
			
	} while (recvResult > 0);
	return NULL;
}

in pratica faccio ritornare solo il buffer ricevuto e lo stampo dal main del client ora funziona non visualizzo piu i caratteri strani però è c'è un'altro problema in pratica se inserisco ciao come prima parola poi dopo ne inserisco una piu lunga tipo buongiorno e poi dinuovo ciao mi esce la stringa ciaogiorno.... è come se rimane memorizzata la stringa piu lunga...come potrei risolvere quest'altro problemino?
Ultima modifica effettuata da Gemini 01/03/22 19:27
01/03/22 19:57
nessuno
E' lo stesso problema


if(recvResult > 0)
{
tmp[recvResult]=0;
return tmp;
}
Ultima modifica effettuata da nessuno 01/03/22 20:14
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
01/03/22 20:52
Gemini
oh grazie mille nessuno posso chiederti se puoi spiegarmi il perchè di questo passaggio così da capire meglio... grazie in anticipo!
01/03/22 21:08
nessuno
Tu programmi in C, sai che le stringhe sono terminata dal carattere NULL (zero binario)?

Quando invii i dati il NULL non viene trasmesso e lo devi aggiungere tu in ricezione per terminare correttamente la stringa.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
03/03/22 12:50
Gemini
Oh grazie mille ora ho capito grazie ancora