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