Socket non invia dati

di il
5 risposte

Socket non invia dati

Sono sempre più impegnato in un maledettissimo client telnet in C.
Ora sono riuscito a fare qualcosa di buono, ma incompleto.
In pratica, il programma riceve i dati benissimo, ma non li invia. Il messaggio di "benvenuto" arriva dal server tranquillamente, e anche quello di disconnessione automatica dopo 5 minuti, ma come ho detto non gli arriva nessun comando.

Ecco il codice dell'intero programma.
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <sys/types.h>
#include <netdb.h>
#include "errori.h"
int main(){
	int sock;
	struct sockaddr_in sock_h;
	struct hostent *host;
	
	host = gethostbyname("ftp.ulysses.altervista.org");
	//Creo socket
	if( (sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
		serrore("Creazione socket fallita.", sock);
	//Connessione
	
	sock_h.sin_family = AF_INET;
	sock_h.sin_port = htons(21);
	sock_h.sin_addr = *(struct in_addr *)host->h_addr;
	
	printf("Connessione in corso...");
	
	if( connect(sock, (struct sockaddr *)&sock_h, sizeof(struct sockaddr) ) == -1)
		serrore("Connessione socket fallita.", sock);
	printf("CONNESSO\n");
	//Invio messaggi
	char *rsp = (char*)malloc(10000);
	int x;
	while (1){
		x = recv(sock, rsp, 10000, 0);
		if(x == 0 || x == -1)
			serrore("Ricezione fallita. Chiusura.", sock);
	printf("\nSERVER #=> %s\n\n", rsp);
	char *msg = (char *)malloc(1024);
	printf("CLIENT #=> ");
	scanf("%s", msg);
	
	if( (send(sock, msg, strlen(msg), 0)) == -1)
		errore("Invio fallito.");
	}
	
	shutdown(sock, 2);
	return 0;
}
La funzione "serrore()" è contenuta in un mio header, e chiude semplicemente il socket e il programma.

5 Risposte

  • Re: Socket non invia dati

    Ciao Ulysses,

    il comando non arriva in quanto non è flushato; anziché usare la scanf usa la fgets.
    Un osservazione d'obbligo sul ciclo dove ogni volta allochi (perdendo il ptr precedente) e non liberi la memoria.
  • Re: Socket non invia dati

    Capisco, ora faccio qualche prova e ti dico.

    Grazie mille, anche per l'osservazione sull'allocazione.
  • Re: Socket non invia dati

    Non funziona ancora...
  • Re: Socket non invia dati

    Ciao Ulysses,

    premetto che il tuo client funziona e per dimostrartelo l'ho modificato sul'host, la porta (necessariamente), aggiunto le funzioni necessarie alla compilazione... insomma l'ho reso compilabile.

    src:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <netinet/in.h>
    #include <string.h>
    #include <sys/types.h>
    #include <netdb.h>
        
    #define HOST "localhost"
    #define PORT 12345
    void serrore (const char *s, int id)
    {
      fprintf (stderr,"%s id=%d\n",s,id);
    }
    
    int main(){
      int sock;
      struct sockaddr_in sock_h;
      struct hostent *host;
           
      host = gethostbyname(HOST);
      //Creo socket
      if( (sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
        serrore("Creazione socket fallita.", sock);
      //Connessione
           
      sock_h.sin_family = AF_INET;
      sock_h.sin_port = htons(PORT);
      sock_h.sin_addr = *(struct in_addr *)host->h_addr;
           
      printf("Connessione in corso...");
           
      if( connect(sock, (struct sockaddr *)&sock_h, sizeof(struct sockaddr) ) == -1)
        serrore("Connessione socket fallita.", sock);
      printf("CONNESSO\n");
      
      //Invio messaggi
      char *rsp = (char *)malloc(10000);
      char *msg = (char *)malloc(1024);
      int x;
      while (1){
        x = recv(sock, rsp, 10000, 0);
        if(x == 0 || x == -1)
          serrore("Ricezione fallita. Chiusura.", sock);
        printf("\nSERVER #=> %s\n\n", rsp);
           
        printf("CLIENT #=> ");
        fgets(msg,1024,stdin);
           
        if( (send(sock, msg, strlen(msg), 0)) == -1)
          serrore("Invio fallito.",0);
      }
           
      shutdown(sock, 2);
           
      free (msg);
      free (rsp);
      return 0;
    }
    
    
    Come dummy server tcp uso netcat
    term1
    
    max@studio:~> nc -l localhost -p 12345
    HELO
    
    term2
    
    max@studio:~> gcc prova.c -Wall -g
    max@studio:~> netstat -apn | grep 12345
    (Not all processes could be identified, non-owned process info
     will not be shown, you would have to be root to see it all.)
    tcp        0      0 0.0.0.0:12345           0.0.0.0:*               LISTEN      8886/nc             
    max@studio:~> ./a.out 
    Connessione in corso...CONNESSO
    
    SERVER #=> HELO
    
    
    CLIENT #=> I GOT IT!
    
    term1
    
    max@studio:~> nc -l localhost -p 12345
    HELO
    I GOT IT!
    
  • Re: Socket non invia dati

    Ok ora funziona, era solo che non avevo ben capito come usare fgets (prima volta in vita mia che mi imbatto con quella funzione, e devo dire che è a dir poco comoda).

    Grazie infinite
Devi accedere o registrarti per scrivere nel forum
5 risposte