Questo è un programma che invia una stringa ad un server tramite berkeley socket.
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// Sintassi: EasySockClt [host] [port]
// host: nome del computer sul quale il server
// è in esecuzione
// port: numero della porta da utilizzare
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
#ifndef unix
#include <windows.h>
#include <winsock.h>
#else
#define closesocket close
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#endif
#include <stdio.h>
#include <string.h>
#define PORT 5194
extern int errno;
char localhost[] = "localhost";
int main(int argc, char* argv[])
{
struct hostent *ptrh;
struct protoent *ptrp;
struct sockaddr_in sad, mySad;
int sd;
int port;
char *host;
int n;
char buf[1000];
int option_value, pippo;
#ifdef WIN32
WSADATA wsaData;
WSAStartup(0x0101, &wsaData);
#endif
memset((char *)&sad, 0, sizeof(sad));
sad.sin_family = AF_INET;
memset((char *)&mySad, 0, sizeof(mySad));
mySad.sin_family = AF_INET;
mySad.sin_addr.s_addr = htonl(INADDR_ANY);
mySad.sin_port = htons(9000);
// Controllo la linea di comando per verificare
// che mi sia stata passato il valore della porta
// altrimenti imposto il valore di default
if (argc > 2)
port = atoi(argv[2]);
else
port = PORT;
if (port > 0)
// Converto la porta da byte order a TCP/IP
// network order
sad.sin_port = htons((u_short)port);
else
{
fprintf(stderr,"bad port number %s\n", argv[2]);
exit(1);
}
// Controllo la linea di comando per verificare
// che mi sia stato passato il valore dell'host
// altrimenti imposto il valore di default
if (argc > 1)
host = argv[1];
else
host = localhost;
// Ricavo il puntatore all'host
ptrh = gethostbyname(host);
if (((char *)ptrh) == NULL)
{
fprintf(stderr, "invalid host: %s\n", host);
exit(1);
}
memcpy(&sad.sin_addr, ptrh->h_addr, ptrh->h_length);
// Ricavo le informazioni sul protocollo
if (((int)(ptrp = getprotobyname("tcp"))) == 0)
{
fprintf(stderr, "cannot map \"tcp\" to protocol number");
exit(1);
}
// E le utilizzo per crearmi un socket
sd = socket(PF_INET, SOCK_STREAM, ptrp->p_proto);
if (sd < 0)
{
fprintf(stderr, "socket creation failed\n");
exit(1);
}
// Permetto al socket di essere associato
// ad un indirizzo già in uso.
/*
option_value = 1;
if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR,
(char *)&option_value, sizeof(option_value)) < 0)
{
perror("setsockopt");
exit(1);
}
*/
// Associo il socket utilizzando i parametri
// della struttura sockaddr_in riempiti prece-
// dentemente
if (pippo= bind(sd, (struct sockaddr *)&mySad, sizeof(mySad)) < 0)
{
fprintf(stderr, "bind fallito\n");
exit(1);
}
else fprintf(stderr, "Valore bind: %d", pippo);
// Mi connetto al server
if (connect(sd, (struct sockaddr *)&sad, sizeof(sad)) < 0) {
fprintf(stderr, "connect failed\n");
exit(1);
}
// Attendo la stringa da parte dell'utente
memset(buf, 0, sizeof(buf));
printf("Scrivi una stringa da spedire al server: ");
gets(buf);
// E la spedisco al server
send(sd, buf, strlen(buf),0);
// Leggo la risposta dal server
memset(buf, 0, sizeof(buf));
n = recv(sd, buf, sizeof(buf), 0);
printf("Ricevuto dal server: %s\n", buf);
// Chiudo il socket ed esco
closesocket(sd);
exit(0);
}
Questi sono gli errori che mi dà il compilatore:
[Linker error] undefined reference to `WSAStartup@8'
[Linker error] undefined reference to `htonl@4'
[Linker error] undefined reference to `htons@4'
[Linker error] undefined reference to `htons@4'
[Linker error] undefined reference to `gethostbyname@4'
[Linker error] undefined reference to `getprotobyname@4'
[Linker error] undefined reference to `socket@12'
[Linker error] undefined reference to `bind@12'
[Linker error] undefined reference to `connect@12'
[Linker error] undefined reference to `send@16'
[Linker error] undefined reference to `recv@16'
[Linker error] undefined reference to `closesocket@4'
Help please.