Inviare stringa via TCP

di il
15 risposte

Inviare stringa via TCP

Buonasera a tutti,
sto cercando di scrivere un semplice programma in C che invia una stringa ad un dispositivo connesso via Ethernet, tramite protocollo TCP.
Ho fatto diverse ricerche (è la prima volta che "sperimento" questa tipologia di applicazioni) ed ho scritto il seguente codice:
#if defined WIN32
#include <winsock2.h>
#else
#define closesocket close
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Inserito perché altrimenti la funzione "ClearWinSock()" restituisce un errore
#pragma comment(lib,"WS2_32")



void ClearWinSock() {
#if defined WIN32
    WSACleanup();
#endif
}



int main() {
	
	#if defined WIN32

		WSADATA wsaData;
		int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
		if (iResult != 0) {
			printf ("Error at WSAStartup");
			return 0;
		}

	#endif





	//Connessione con Server:
	int mioSocket;
	//Indirizzo al quale voglio collegarmi
	struct sockaddr_in server_addr;

	//Con hostent definisco l'indirizzo del Server
	struct hostent *hp;
	hp = gethostbyname("127.0.0.1");
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(1745);
	server_addr.sin_addr.s_addr = ((struct in_addr*)(hp->h_addr)) ->s_addr;
	//Creo il socket
	if((mioSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	printf("Errore nella creazione del socket\n");
	//Effettuo collegamento
	if(connect(mioSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) <0)
	printf("Errore di connessione al server\n");





	//Invio Stringa via TCP:
    char* inputString = "Stringa di prova";
    int stringlen = strlen(inputString);


    if (send(mioSocket, inputString, stringlen, 0) != stringlen) {
        printf("Si è verificato un errore.");
        closesocket(mioSocket);
        ClearWinSock();
        system ("pause");
        return 0;
    }




//Chiudo la connessione
closesocket (mioSocket);
ClearWinSock();


printf ("\n");
system ("pause");
return 0;

}
Confrontandolo anche con altri codici e documentazione varia non mi sembra ci siano grossi errori, tuttavia ricevo degli errori che non comprendo:
1>------ Inizio compilazione: Progetto: tcp_test_001, Configurazione: Debug Win32 ------
1>  main.c
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(49): error C2143: errore di sintassi: ';' mancante prima di 'tipo'
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(51): error C2143: errore di sintassi: ';' mancante prima di 'tipo'
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(54): error C2143: errore di sintassi: ';' mancante prima di 'tipo'
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(55): error C2065: 'hp': identificatore non dichiarato
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(55): warning C4047: '=': 'int' differisce da 'hostent *' nei livelli di riferimento indiretto
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(56): error C2065: 'server_addr': identificatore non dichiarato
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(56): error C2224: l'elemento a sinistra di '.sin_family' deve avere un tipo struct/union
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(57): error C2065: 'server_addr': identificatore non dichiarato
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(57): error C2224: l'elemento a sinistra di '.sin_port' deve avere un tipo struct/union
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(58): error C2065: 'server_addr': identificatore non dichiarato
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(58): error C2224: l'elemento a sinistra di '.sin_addr' deve avere un tipo struct/union
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(58): error C2065: 'hp': identificatore non dichiarato
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(58): error C2223: l'elemento a sinistra di '->h_addr_list' deve puntare a struct/union
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(60): error C2065: 'mioSocket': identificatore non dichiarato
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(63): error C2065: 'mioSocket': identificatore non dichiarato
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(63): error C2065: 'server_addr': identificatore non dichiarato
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(71): error C2143: errore di sintassi: ';' mancante prima di 'tipo'
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(72): error C2143: errore di sintassi: ';' mancante prima di 'tipo'
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(75): error C2065: 'mioSocket': identificatore non dichiarato
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(75): error C2065: 'inputString': identificatore non dichiarato
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(75): warning C4047: 'funzione': 'const char *' differisce da 'int' nei livelli di riferimento indiretto
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(75): warning C4024: 'send': tipi diversi tra il parametro 2 formale e quello effettivo
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(75): error C2065: 'stringlen': identificatore non dichiarato
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(77): error C2065: 'mioSocket': identificatore non dichiarato
1>c:\users\user\documents\visual studio 2012\projects\tcp_test_001\tcp_test_001\main.c(87): error C2065: 'mioSocket': identificatore non dichiarato
========== Compilazione: 0 completate, 1 non riuscite, 0 aggiornate, 0 ignorate ==========
Sicuramente c'è qualcosa che non va (anche) con il tipo di progetto. Ho provato a ricrearlo ma non va lo stesso.
Nello specifico:
- Utilizzo Visual Studio Premium 2012
- Il file è un file *.c (ho provato anche con un file *.cpp ma non cambia nulla - anzi la situazione peggiora)


Sapreste darmi una mano?
Grazie in anticipo a chiunque vorrà aiutarmi

15 Risposte

  • Re: Inviare stringa via TCP

    Evidentemente è un copione-incollone.
    Preferisco insegnarti il modo da adottare in questi casi, piuttosto che spiegare il perchè e il percome.
    Comincia così: commenta tutte le parti del programma, riducendolo a un "ciao mondo" (che compila ed esegue).
    Poi, progressivamente, riduci le aree commentate per individuare esattamente qual'è il problema.
  • Re: Inviare stringa via TCP

    Se lo compili come .cpp non hai problemi, a meno di una segnalazione di una API deprecata che correggi aggiungendo all'inizio

    #pragma warning(disable:4996)

    Comunque concordo sul copione-incollone di codice obsoleto.
  • Re: Inviare stringa via TCP

    +m2+ ha scritto:


    Evidentemente è un copione-incollone.
    Preferisco insegnarti il modo da adottare in questi casi, piuttosto che spiegare il perchè e il percome.
    Comincia così: commenta tutte le parti del programma, riducendolo a un "ciao mondo" (che compila ed esegue).
    Poi, progressivamente, riduci le aree commentate per individuare esattamente qual'è il problema.
    E' chiaro che è un copione-incollone, ho scritto che ho preso il codice da varie parti e l'ho assemblato come meglio credevo.
    Non capisco cosa dovresti insegnarmi.
    Ho già commentato il tutto per isolare il problema ma non ho risolto. Avevo scritto che avevo provato anche a svilupparlo su file .cpp ma non cambiava nulla: ora ho riprovato e compila. Non capisco perché funziona (magari ieri o io o il pc eravamo ubriachi ), comunque grazie @oregon per avermi suggerito di (ri)provare con il file .cpp.

    oregon ha scritto:


    Se lo compili come .cpp non hai problemi, a meno di una segnalazione di una API deprecata che correggi aggiungendo all'inizio

    #pragma warning(disable:4996)

    Comunque concordo sul copione-incollone di codice obsoleto.
    Onestamente facendo varie ricerche questo mi è sembrato il codice più "recente".
    Non ci volevo perdere troppo tempo perché mi serve solo inviare una serie di stringhe e nulla più.
    Sapreste dirmi come correggere questo codice obsoleto?

    Grazie mille!
  • Re: Inviare stringa via TCP

    Hai letto completamente il mio post?

    La linea che ti ho scritto di aggiungere indica proprio di ignorare la parte obsoleta e il fatto di usare il .cpp ti consentirà di non avere errori.
  • Re: Inviare stringa via TCP

    oregon ha scritto:


    Hai letto completamente il mio post?

    La linea che ti ho scritto di aggiungere indica proprio di ignorare la parte obsoleta e il fatto di usare il .cpp ti consentirà di non avere errori.
    Si si. Non mi sono spiegato: intendevo dire, dato che evidentemente sto usando codice obsoleto, sapreste dirmi che codice utilizzare?
    Visto che per quel che devo fare io il codice è molto piccolo, tanto vale scriverlo decente.

    Seguendo il tuo consiglio comunque ho già risolto il problema riguardante la compilazione.
  • Re: Inviare stringa via TCP

    Pensavo di avertelo già scritto.
    Se non sai fare niente (è normale, capita a tutti all'inizio) parti da un "ciao mondo".
    Poi aggiungi il "copia-incollone", un po' alla volta, per farti un'idea.
    Per quanto il programma sia banale, bisognerà pure che tu sappia come funziona, anche se fai il "copioncollo"
  • Re: Inviare stringa via TCP

    +m2+ ha scritto:


    Pensavo di avertelo già scritto.
    Se non sai fare niente (è normale, capita a tutti all'inizio) parti da un "ciao mondo".
    Poi aggiungi il "copia-incollone", un po' alla volta, per farti un'idea.
    Per quanto il programma sia banale, bisognerà pure che tu sappia come funziona, anche se fai il "copioncollo"
    Io penso sia stupido perder tempo a studiare tutta la documentazione solo per sviluppare un'applicazione che invia una stringa in locale.
    In passato la pensavo come te e per far qualsiasi cosa mi mettevo a studiare di tutto e poi mi scrivevo tutte le funzioni da zero. Il risultato era che imparavo tantissimo su singoli argomenti ma per scrivere un'applicazione ci mettevo un mese.
    Ho preso quelle parti di codice ma so cosa fanno (penso che anche chi non ha mai programmato in vita sua capirebbe cosa fanno quelle funzioni) quindi ho incollato consciamente.
    Non capisco se sei un professore dato che dal tono mi sembra di intuire che hai molta voglia di insegnare a tutti i costi qualcosa, ma in caso contrario ti posso assicurare che la mia aspettativa su questo thread è rimasta invariata: voglio solo capire (in modo molto concreto) come inviare una serie di stringhe tramite TCP. Nulla di meno, nulla di più.

    Spero non fraintenderai lo spirito della mia risposta: semplicemente penso che da uno schermo è facile non capire chi si ha davanti quindi farmi dare delle lezioni non richieste non mi garba molto. Ho già ricevuto molte lezioni durante la mia carriera universitaria ed ho una discreta esperienza informatica (seppur io mi occupi di altri settori d'applicazione).

    Grazie mille comunque per il tuo intervento!
  • Re: Inviare stringa via TCP

    Enrichetto ha scritto:


    ...
    Io penso sia stupido perder tempo a studiare tutta la documentazione solo per sviluppare un'applicazione che invia una stringa in locale...
    Se non sai fare neppure questo (inviare una stringa) significa che sei a livello zeresimo (lo dico senza scherno, ma è una costatazione).
    Avessi fatto il copia-incolla di non so che superalgoritmo di ordinamento, OK.
    Ma qui siamo proprio alle basi.
    ...Non capisco se sei un professore ...
    Lo sono stato (sia pure per brevissimo tempo).
    Adesso il mio lavoro è correggere quello dei professori, o meglio valutarlo per rilevare gli errori, e spiegare come avrebbero dovuto operare.
    dato che dal tono mi sembra di intuire che hai molta voglia di insegnare a tutti i costi qualcosa ...
    Se non vuoi, a tutti i costi, imparare qualcosa [quando, manifestamente, ne hai decisamente necessità] pazienza.

    Se tu definisci "discreta esperienza informatica" QUESTA, allora io ho una competenza informatica soprannaturale
    E su, fattela una risata invece di essere permaloso (soprattutto quando non hai le competenze per esserlo).
  • Re: Inviare stringa via TCP

    +m2+ ha scritto:


    Enrichetto ha scritto:


    ...
    Io penso sia stupido perder tempo a studiare tutta la documentazione solo per sviluppare un'applicazione che invia una stringa in locale...
    Se non sai fare neppure questo (inviare una stringa) significa che sei a livello zeresimo (lo dico senza scherno, ma è una costatazione).
    Avessi fatto il copia-incolla di non so che superalgoritmo di ordinamento, OK.
    Ma qui siamo proprio alle basi.
    ...Non capisco se sei un professore ...
    Lo sono stato (sia pure per brevissimo tempo).
    Adesso il mio lavoro è correggere quello dei professori, o meglio valutarlo per rilevare gli errori, e spiegare come avrebbero dovuto operare.
    dato che dal tono mi sembra di intuire che hai molta voglia di insegnare a tutti i costi qualcosa ...
    Se non vuoi, a tutti i costi, imparare qualcosa [quando, manifestamente, ne hai decisamente necessità] pazienza.

    Se tu definisci "discreta esperienza informatica" QUESTA, allora io ho una competenza informatica soprannaturale
    E su, fattela una risata invece di essere permaloso (soprattutto quando non hai le competenze per esserlo).
    Se passi parte del tuo tempo libero sulla sezione C/C++ di un forum di programmazione allora è chiaro che questo è il "tuo settore". Io mi occupo di altro e utilizzo altri linguaggi.
    Affermare che un argomento (i socket in C) rappresentino le basi dell'informatica penso sia molto stupido. Le basi sono altre.
    Analogamente io potrei aprire una discussione sul "mio settore" e darti lezioni fino a Dicembre, affermando che quelle sono le basi.
    Poi se vuoi giocare a chi ce l'ha più lungo ne parliamo in privato perché non mi va di raccontare della mia vita qui.
    Non capisco il "sono stato un professore per brevissimo tempo [...] Adesso il mio lavoro è correggere quello dei professori": non riesco a capire se prendi in giro oppure se hai una professione creata ad hoc per te.
    Infine ti do ragione sul fatto della permalosità: odio sempre chi fa lo spocchioso, sopratutto sui forum.
  • Re: Inviare stringa via TCP

    Non è mai "stupido" impiegare tempo a studiare ... non posso condividere questo tuo atteggiamento, ma se quello che ti serve è un copia-incollone migliore e basta, allora vedi gli esempi di Microsoft (fra l'altro, bastava cercarli ... non bisogna studiare per questo)

    Complete Winsock Client Code


    Complete Winsock Server Code
  • Re: Inviare stringa via TCP

    Enrichetto ha scritto:


    Se passi parte del tuo tempo libero sulla sezione C/C++ di un forum di programmazione allora è chiaro che questo è il "tuo settore". Io mi occupo di altro e utilizzo altri linguaggi.
    Pure io, anzi raramente mi occupo di C++
    Affermare che un argomento (i socket in C) rappresentino le basi dell'informatica penso sia molto stupido.
    Sarà molto stupido, ma è una tua opinione che dimostra ignoranza abissale (=nel senso di mancanza di conoscenza)
    Analogamente io potrei aprire una discussione sul "mio settore" e darti lezioni fino a Dicembre, affermando che quelle sono le basi.
    Se parliamo di informatica la vedo davvero difficile.
    Puoi sempre provare
    Non capisco il "sono stato un professore per brevissimo tempo [...] Adesso il mio lavoro è correggere quello dei professori": non riesco a capire se prendi in giro oppure se hai una professione creata ad hoc per te.
    E' una professione che esiste da almeno un 70 anni.
    E no, non ti prendo affatto in giro.
    Infine ti do ragione sul fatto della permalosità: odio sempre chi fa lo spocchioso, sopratutto sui forum.
    Allora di auto-odi ? Fico!
  • Re: Inviare stringa via TCP

    Affermare che un argomento (i socket in C) rappresentino le basi dell'informatica penso sia molto stupido.
    Sarà molto stupido, ma è una tua opinione che dimostra ignoranza abissale (=nel senso di mancanza di conoscenza)
    Tranquillo, non c'è bisogno che giustifichi tra parentesi le parole che usi.
    Comunque sei libero di pensare che questa mia idea denoti ignoranza abissale. Magari non hai nemmeno una laurea e le tue conoscenze si limitano ad un corso di studi tecnico delle superiori, integrato da un po' di sana gavetta unita a tanta buona volontà e quindi questo non ti consente di comprendere il senso della mia affermazione.
    Analogamente io potrei aprire una discussione sul "mio settore" e darti lezioni fino a Dicembre, affermando che quelle sono le basi.
    Se parliamo di informatica la vedo davvero difficile.
    Puoi sempre provare
    Ma chi ti credi di essere?
    Non capisco il "sono stato un professore per brevissimo tempo [...] Adesso il mio lavoro è correggere quello dei professori": non riesco a capire se prendi in giro oppure se hai una professione creata ad hoc per te.
    E' una professione che esiste da almeno un 70 anni.
    E no, non ti prendo affatto in giro.
    Qui mi tocca correggerti: l'idiota esista da più di 70 anni. P.S.: è una battuta, fattela una risata
    Infine ti do ragione sul fatto della permalosità: odio sempre chi fa lo spocchioso, sopratutto sui forum.
    Allora di auto-odi ? Fico!
    Mi ricordi quando da bambino si usava dire "specchio riflesso!". Dove ho fatto lo spocchioso? Qui l'unico che si vanta di essere un Dio dell'informatica sei tu. Io non mi sono permesso di dire nulla che vada oltre l'obiettivo di questo thread né ho tentato di fare il superiore (e sono abbastanza sicuro che uno come te dal punto di vista lavorativo starebbe sotto di me - sia per mansioni che per compenso economico, che tu ci creda o no - e questo alla fine è quel che conta).
  • Re: Inviare stringa via TCP

    Enrichetto ha scritto:


    ... Magari non hai nemmeno una laurea e le tue conoscenze si limitano ad un corso di studi tecnico delle superiori
    Ehhh... sì... hai proprio ragione!
    Ma chi ti credi di essere?
    hic Rhodus, hic salta.
    Se vuoi provare...fallo pure, non è che sia particolarmente preoccupato.
    ... (e sono abbastanza sicuro che uno come te dal punto di vista lavorativo starebbe sotto di me - sia per mansioni che per compenso economico, che tu ci creda o no - e questo alla fine è quel che conta).
    ****
    Davvero hai queste idee, cioè che SE (ed è un grosso SE. Non sai mai chi trovi su un forum... ) il tuo compenso economico (?) sia superiore al mio (?), tu sapresti di informatica più di me?


    E se, per caso, giusto per caso, capitasse il contrario, cioè che il mio "compenso economico" sia di gran lunga superiore al tuo, e che (dal punto di vista lavorativo) potresti (al massimo) lavarmi l'auto, perderesti la tua autostima?
    Ma cos'hai, 12 anni? Devo chiamare il Telefono Azzurro?
  • Re: Inviare stringa via TCP

    Enrichetto ha scritto:


    Qui mi tocca correggerti: l'idiota esista da più di 70 anni. P.S.: è una battuta, fattela una risata
    Hai ragione, ho controllato, sono 77 anni, saranno 78 a ottobre.
Devi accedere o registrarti per scrivere nel forum
15 risposte