Newsgroup: it.comp.os.linux.development
Titolo: TCP/IP

Vorrei fare in modo che una scheda che sto programmando in c, sia in
grado di gestire una connessione TCP/IP e quindi di comunicare con un
server qualcuno sa darmi qualche dritta o dirmi dove posso reperire
alcune informazioni dato che non so bene da dove partire
Grazie!

fede ha scritto:

Cerca Gapil su google, di informazioni ne trovi a sfare...

Ho cercato sia quello che mi hai detto che altre cose ho trovato
diverse informazioni e molti esempi non riesco a capire una cosa vi
metto la codifica e spero che qualcuno mi sappia diere cosa viene
fatto:
/*file client1.c */
/* implementazione di client per il server iterativo */
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netdb.h>
#include<netinet/in.h>
#include <stdlib.h>
#define Max 8000
int main(void) {
int sd;
struct sockaddr_in client;
struct hostent *hp;
unsigned short port = 9000;
char buff[Max];
/* Dobbiamo riempire la struttura client ma prima
 * ci occorrono alcune
 * informazioni che ricaviamo appoggiandoci
 * alla struttura hp
 */
hp = gethostbyname("127.0.0.1");
bzero(&client, sizeof(client));
client.sin_family = AF_INET;
client.sin_port = htons(port);
client.sin_addr.s_addr =((struct in_addr*)(hp->h_addr))->s_addr;
/* Creiamo il socket */
if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    printf("Errore nella creazione del socket!\n");
else
    printf("socket creato!\n");
/* connettiamoci all'host */
if (connect(sd, (struct sockaddr *)&client, sizeof(client)) < 0)
    printf("Errore di connessione!\n");
/* Inviamo dei dati */
send(sd, "Dati inviati dal client", strlen("Dati inviati dal client")
+1, 0);
/*riceviamo la risposta */
recv(sd, buff, sizeof(buff), 0);
printf("Risposta del server: %s\n", buff);
close(sd);
return EXIT_SUCCESS;
}
io non riesco a capire la parte in cui viene utilizzata la struttura
hostent, qualcuno mi sa spiegare come va utilizzata grazie!

ho cercato e trovato diverse informazioni ed esempi ma non ho ancora
del tutto capito alcune cose, ad esempio in questo semplice prog
client:

#define Max 8000










/*riceviamo la risposta */

non riesco a capire l'utilizzo di struct hostent *hp; e delle sue
funzioni, e su come devo utilizzarla io se qualcuno mi sa dare un mano
lo ringrazio anticipatamente!

 
La funzione gethostbyname() ritorna il puntatore alla struttura
struct hostent {
    char    *h_name;        /* official name of host */
    char    **h_aliases;    /* alias list */
    int     h_addrtype;     /* host address type */
    int     h_length;       /* length of address */
    char    **h_addr_list;  /* list of addresses */
};
#define h_addr  h_addr_list[0]  /* for backward compatibility */
che contiene il nome, eventuali alias ed una lista di indirizzi IO 
associati al nome.
Nel caso specifico vengono ricavati i dati per inizializzare la 
struttura client (di tipo sockaddr) che a sua volta serve per la 
funzione connect().
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

 Di solito il nome locale e` "localhost".
quindi io qua non dovrei mettere l'ip ma "localhost"? in piu la cosa
che non ho capito se io uso qusto programmino su un pc e metto li l'ip
del server a cui si deve collegare funziona


Boh il manuale dice che ci va in nome dell'host.  Forse con la stringa 
con l'ip funziona ugualmente.
Quanto al fatto che se metti l'ip di un server tutto funziona, 
significa solo che su quella macchina c'e` un programma server che 
ascolta sulla porta 9000.


Ho provato a stampare gli errori della lib errno.h dopo la non
avvenuta connessione e ho avuto i seguenti risultati
connection refused - se utilizzo come hp =
gethostbyname("192.168.0.90");
hp = gethostbyname("localhost");
No route to host - se utilizzo hp = gethostbyname("192.168.0.233");
L'ip 192.168.0.90 è quello della scheda con linux embedded cioe quella
su cui gira il programma client
L'ip 192.168.0.233 è quello su cui sta girando il programma che fa da
server
Io la cosa che continuo a non capire e come mai usando lo stesso
programma su di un pc, con linux, e facendo fare da server al sistema
embedded funziona tutto correttamete invertendo le due cose mi da
questi errori in fase di connessione