Sono nuovo al C ma non alle reti in generale e sgattaiolando tra info trovate su internet ho tentato di realizzare un piccolo client che mi permettesse di collegarmi a qualsiasi servizio:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <unistd.h>
#include <netdb.h>
#define SLEEP_TIME 10
int
main (int argc, char **argv)
{
int tcp_socket,n,nrecv,nsend,len,i,j;
int TCP_PORT;
struct sockaddr_in tcp_server;
struct hostent *ptrh;
struct in_addr a;
char buffer[1024];
char stringa[2048];
char buffer_to_read;
if (argc < 2)
{
// non e' possibile leggere l'indirizzo IP del server!
printf ("Nessun IP del server indicato!\n");
exit (-1);
}
printf("Inserire porta TCP: ");
scanf("%d",&TCP_PORT);
printf("\nInserire lunghezza stringa da leggere max 2048: ");
scanf("%d",&len);
printf("\n");
// creiamo la socket per TCP
tcp_socket = socket (AF_INET, SOCK_STREAM, 0);
if (tcp_socket <= 0)
{
printf ("Errore nella creazione della socket tcp!\n");
exit (-1);
}
ptrh=gethostbyname (argv[1]);
// azzeriamo la struttura dati con le informazioni ...
bzero (&tcp_server, sizeof (tcp_server));
// impostiamo come "famiglia" quella di rete ...
tcp_server.sin_family = AF_INET;
// associamo la socket a qualsiasi interfaccia di rete ...
memcpy(&tcp_server.sin_addr, ptrh->h_addr,ptrh->h_length);
// impostiamo la porta remota di ascolto ...
tcp_server.sin_port = htons (TCP_PORT);
// apriamo la connessione
if (connect
(tcp_socket, (struct sockaddr *) &tcp_server, sizeof (tcp_server)) < 0)
{
// errore nella connessione, interrompiamo l'esecuzione
printf ("Errore nella connessione al server!\n");
exit (-1);
}
// leggiamo tutti i dati che ci invia il server e mettiamoli a video!
printf ("connessione al server!\n");
n=1;nrecv=0;i=0;
while (recv (tcp_socket, &(stringa[i]),len,0)) {
printf("%s",&(stringa[i]));
i=i+n;
}
send (tcp_socket, &(stringa[i]), len, 0);
//send (tcp_socket, stringa, len, 0);
printf("n= %d \nScrivi al server \n",n);
scanf("%s",&stringa);
printf("Attendi...");
send (tcp_socket, stringa, len, 0);
// chiudiamo la connessione!
close(tcp_socket);
return 0;
}
In sostanza ho provato a collegarmi ad un server ftp o telnet in locale o remoto.RIsultato ad esempio per telnet:
ottengo la videata completa delle info mandate dal server, ma non mi viene restituita la possibilità di inviare niente al server.
Non capisco ci deve essere un problema di sincronizzazione. Ad esempio dopo aver ottenuto LOGIN: da collegamente con il telnet server del mio router dovrei inserire nome user e password ma la possibilità di inserire il nome user non mi viene data. Eppure il server mi invia tutto perfettamente fino al login
Cosa impedisce al mio client terminate le recv di usare la send allo stesso socket?
GRAZIE in anticipo!
CIAO A TUTTI!