Send e recv con socket

di il
7 risposte

Send e recv con socket

Ciao ragazzi!! ho di nuovo bisogno del vostro aiuto.
ho iniziato a studiare i socket. una volta creato, bindato e connesso il server al client mi sono bloccato.
come prima prova vorrei che il mio client una volta connettosi al server mi chieda di inserire un testo di prova. Una volta inserito il testo di prova il server me lo stampa e mi chiuda la connessione.
sono arrivato al punto di riuscire a far ricevere al server il mio messaggio solo che me lo stampa in maniera strana. premetto che sono un principiante, potrei aver scritto delle assurdità. scusate per le eventuali ca..ate che ho scritto o fatto.
vi posto il mio codice:

CLIENT:

#include <stdio.h>
#include <windows.h>
#include <WinSock2.h>
#include <iostream>
#include <string>
#include <io.h>

#define PORT 1234
#define SERVERADDRESS "192.168.44.62"
#define MAXBUF 32

using namespace::std;


int main(void)
{
	WSADATA wsa;

	cout << ("inizializzazione windowsk ...(WSADATA)") << endl;
	if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
	{
		cout << ("Errore Codice di errore:% d", WSAGetLastError());
		return 1;
	}


	int sd, fd, valread;
	struct sockaddr_in server, client;
	char buffer[MAXBUF];
	char * client_address;


	// apertura del server socket

	if (((sd = socket(AF_INET, SOCK_STREAM, 0))) == -1)
	{
		cerr << "ERRORE NELLA CREAZIONE DEL SOCKET." << endl;
		exit(-1);

	}
	else
	{
		cout << "apertura del socket.." << endl;
	}

	// preparazione dell' indirizzo locale del server

	//memset(&server, '0', sizeof(server));

	server.sin_family = AF_INET;
	server.sin_port = htons(PORT);
	server.sin_addr.s_addr = inet_addr(SERVERADDRESS); //htonl(INADDR_ANY);



	if (connect(sd, (struct sockaddr *)&server, sizeof(server)) < 0)
	{
		cout << "\nCconnessione fallita." << endl;
		return -1;
	}
	cout << "cosa vuoi inviare? " << endl;
	char *stringa;
	cin >> stringa;
	if (send(sd, stringa, sizeof(stringa), 0) == -1)
	{
		cout << "errore, non ho inviato il tuo messaggio.";
		return 1;
		exit(1);
	}
	else
	{
		cout << "messaggio inviato" << endl;
		//valread = read(sd, buffer, 1024);
		//printf("%s\n", buffer);
		system("pause");
		return 0;
	}
	
}
SERVER:

#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include <string.h>

#define SERVERPORT 1234
#define SERVERADDRESS "192.168.44.62"
#define MAXBUF 32

using namespace::std;

int main(void)
{


	int fd;
	int sd = 0, valread;
	struct sockaddr_in server, client;
	char buffer[MAXBUF];
	char * client_address;


	// apertura del server socket

	if (((sd = socket(AF_INET, SOCK_STREAM, 0))) == -1)
	{
		cerr << "ERRORE NELLA CREAZIONE DEL SOCKET." << endl;
		exit(-1);

	}
	else
	{
		cout << "apertura del socket.." << endl;
	}

	// preparazione dell' indirizzo locale del server

	server.sin_family = AF_INET;
	server.sin_port = htons(SERVERPORT);
	server.sin_addr.s_addr = inet_addr(SERVERADDRESS); //htonl(INADDR_ANY);




	if ((bind(sd, (struct sockaddr*) &server, (sizeof server))) == -1)
	{
		cout << "errore nel bind della socket";
		getchar(); //system("pause");
		exit(-1);
	}

	else
	{
		cout << "sto bindando il server.." << endl;
	}

	listen(sd, 1);
	int client_len;
	client_len = sizeof client;

	cout << "in attesa di una connessione..:" << endl;
	while (1)
	{


		if ((fd = accept(sd, (struct sockaddr *)&client, (socklen_t*)&client_len)) == -1)
		{
			cout << "errore accept server" << endl;
			getchar();// system("pause");
			exit(-1);
		}
		else
		{
			cout << "sto asspettando una connessione\n" << endl;
			cout << "connesso sul server all' indirizzo: ";
			cout << ("ip client: %s\n", inet_ntoa(client.sin_addr)) << endl;
			//getchar();
			//cout << "inserisci il messaggio che vuoi inviare al tuo socio: " << endl;
			//char *valoreinserito[256];
			//cin >> valoreinserito;	
			char *stringa[256];
			//valoreinserito = stringa;
			if(read(fd, stringa, sizeof(stringa, 256)) == -1)
			{
				cout << "errore nella ricezione del messaggio" << endl;
				close(fd);
				exit(1);
			}
			else
			{
				//system("pause");	
				//memset(stringa, '\0', sizeof(stringa));
				printf( "%s\n",stringa);
				//cout << *stringa;
				//send(fd, stringa, strlen(stringa), 0);
				//cout << "hai inviato il messaggio eheh"	
				close(fd);
				return 0;
			}
			
			
		}
		

	}




	return 0;
}

OUTPUT SERVER:
apertura del socket..
sto bindando il server..
in attesa di una connesione..:
sto aspettando una connessione

connesso sul server all' indirizzo: 192.168.44.49
CIAO (oltre al CIAO mi stampa dei caratteri strani non riconosciuti e non so cosa sono e se li provo ad incollare non li incolla.

OUTPUT CLIENT:
inizializzazione windowsk ...(WSADATA)
apertura del socket..
cosa vuoi inviare?
CIAO
messaggio inviato
Premere un tasto per continuare . . .

Ora io con questo thread vi chiedo gentilmente se sapreste dirmi cosa c'è che non va nel mio codice, il perchè mi stampa quel CIAO in maniera assurda e in che modo potrei migliorarlo, se riuscite a darmi qualche delucidazione riguardo ai socket per favore.
avviso che sto studiando e imparando da solo. sono partito da 0 e spero che un giorno riuscirò a iscrivermi alla scuola serale di informatica.

con questo vi ringrazio in anticipo e spero nel sempre mitico aiuto di questo forum.

7 Risposte

  • Re: Send e recv con socket

    Devi salvare il valore di
    if(read(fd, stringa, sizeof(stringa, 256)) == -1)
    perché se >0 ti dice quanti caratteri hai ricevuto.
  • Re: Send e recv con socket

    nicolap ha scritto:


    Devi salvare il valore di
    if(read(fd, stringa, sizeof(stringa, 256)) == -1)
    perché se >0 ti dice quanti caratteri hai ricevuto.
    in che senso?

    EDIT:

    la dimensione del buffer tra server e client non coincidevano. una volta sistemate il CIAO lo scrive correttamente. solo che scrive solo quello, se ad esempio scrivo "ciaooooo" lui mi scrive solo "ciao".
    avete qualche suggerimento?
  • Re: Send e recv con socket

    Probabilmente non stai gestendo correttamente i buffer come ti è già stato fatto notare. IDE+debug+breakpoint è la soluzione
  • Re: Send e recv con socket

    Le stringhe in C hanno bisogno del terminatore
    0x0
    quindi una volta che ricevi i dati dal socket lo devi aggiungere tu.
    cioè se ricevi 10 caratteri, usando il puntatore alla stringa aggiungi 10 al puntatore e scrivi '/0'
    così quando stampi non stamperà porcherie
  • Re: Send e recv con socket

    Guarda questo esempio

    http://www.feelinglinux.com/articles/usosocket.js

    cerca nel server il commento
    //Aggiusto la lunghezza...

    anche se lui usa una stringa di caratteri e non un puntatore come te
  • Re: Send e recv con socket

    Intanto

    char *stringa[256];

    rappresenta 256 puntatori a char e non una stringa di 256 char...

    Perché scrivere codice più complesso se non si padroneggiano ancora le basi?
  • Re: Send e recv con socket

    oregon ha scritto:


    Intanto

    char *stringa[256];

    rappresenta 256 puntatori a char e non una stringa di 256 char...

    Perché scrivere codice più complesso se non si padroneggiano ancora le basi?
    hai ragione..
    l' ho sistemato togliendo i puntatori. purtroppo sono un principiante e sto imparando da solo. scusate gli errori banali che posso commettere.
Devi accedere o registrarti per scrivere nel forum
7 risposte