PDA

Visualizza la versione completa : [C++] Invio di stringhe tramite Berkeley Socket


Elninno
09-01-2007, 20:47
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.

MItaly
09-01-2007, 21:48
Non hai linkato il tutto alle varie librerie di importazione (.lib) necessarie.

Elninno
09-01-2007, 22:17
quindi che cosa devo aggiungere al codice che ho postato?

MItaly
09-01-2007, 22:36
Non devi aggiungere nulla al codice, devi modificare la riga di comando del compilatore (o del linker) dicendo di linkare al tuo codice Ws2_32.lib. Se usi Visual C++ puoi anche semplicemente inserire all'inizio del file il seguente pragma:


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

Elninno
11-01-2007, 08:56
ok,funziona..grazie

Loading