Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 14-01-2010, 19:16   #1
ginter87
Member
 
Iscritto dal: Apr 2008
Messaggi: 62
[C] Segmentation Fault!!! Socket in ambiente Unix

Sto eseguendo un elaborato implementato con i socket e un altro popò di roba ma per adesso sto scrivendo la base per il collegamento. L'ho eseguito ma ... dal lato server è tutto ok! Si mette in attesa di connessioni ... mentre dal lato client .. dopo che inserisco l'indirizzo del server e della porta dove connettersi ... mi da "segmentation fault"

Perche mai?

Posto un pò il codice del client???

Ditemi voi e io lo faccio

grazie
ginter87 è offline   Rispondi citando il messaggio o parte di esso
Old 14-01-2010, 19:39   #2
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4908
Quote:
Originariamente inviato da ginter87 Guarda i messaggi
Posto un pò il codice del client???
Direi... così è un po' vago.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2010, 14:36   #3
ginter87
Member
 
Iscritto dal: Apr 2008
Messaggi: 62
perciò ... è la prima volta che incollo codice, vediam come fare ...

questo è quello del CLIENT


Codice:
#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>



#include "common.h"





int sd; //socket descriptor
int porta; 
char indirizzo[20]; //indirizzo server

struct sockaddr_in server_addr;

struct hostent *hostinfo;

socklen_t len;



int main(int argc, char *argv[])

{
  printf("inserisci l'indirizzo server\n");
  scanf("%s",indirizzo);
  printf("inserisci porta \n");
  scanf("%d",&porta);

  
  printf("Creo il socket\n");

  sd = socket(AF_INET, SOCK_STREAM, 0);

  if (sd < 0)

    {

      perror("Durante la creazione del socket\n");

      exit(1);

    }



  // prepara i dati per la connessione con il server

  server_addr.sin_family = AF_INET;

  server_addr.sin_port = porta;

  server_addr.sin_addr.s_addr = inet_addr(indirizzo);

  hostinfo = gethostbyname(argv[1]);

  
if (hostinfo == NULL)

    {

      printf("Non è stato possibile risolvere il nome del server\n");

      exit(1);

    }

  else

    server_addr.sin_addr = *((struct in_addr *) hostinfo->h_addr);





  printf("Apro la connessione\n");

  if (connect(sd, (struct sockaddr *) &server_addr, sizeof(struct sockaddr_in)) < 0)

    {

      perror("Durante la connect");

      exit(1);

    }



// codice client di send e recv

printf("sono il client!!!!");

  exit(0);

}

devo mettere anche quello del server???
ginter87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2010, 14:37   #4
ginter87
Member
 
Iscritto dal: Apr 2008
Messaggi: 62
vabbè c'è un errore...avevo modificato il mio codice che inizialmente avevo scritto con inserimento dell'indirizoz del server su linea di comando ... ora invece glielo chiedo e metto l'indirizzo in una variabile ... c'è un argv[1] che devo modificare cmq il codice è questo
ginter87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2010, 14:51   #5
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
il codice d'errore che hai postato, specifica sui i sistemi unix, che si è tentato di scrivere in una zona di memoria in cui non era consentito farlo.
Probabilmente hai dimenticato di allocare memoria per una variabile o altro genere di cose...

non mi sono messo ad analizzare il codice ma se usi un debugger vai step per step fino a che non trovi l'istruzione che genera il problema di memoria.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2010, 14:59   #6
ginter87
Member
 
Iscritto dal: Apr 2008
Messaggi: 62
Quote:
Originariamente inviato da Teo@Unix Guarda i messaggi
il codice d'errore che hai postato, specifica sui i sistemi unix, che si è tentato di scrivere in una zona di memoria in cui non era consentito farlo.
Probabilmente hai dimenticato di allocare memoria per una variabile o altro genere di cose...

non mi sono messo ad analizzare il codice ma se usi un debugger vai step per step fino a che non trovi l'istruzione che genera il problema di memoria.

d'accordo! Comunque non so cosa ho fatto di preciso a parte correggere quell'argv[1] ma non mi da piu quell'errore

me ne da un'altro -.-''

Il server va ok, specifica la porta da cui accettare le connessioni e si mette in attesa
quando eseguo il client invece

Codice:
inserisci l'indirizzo server
127.0.0.1
inserisci porta 
180
Creo il socket
Apro la connessione
Durante la connect: Connection refused
ginter87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2010, 15:49   #7
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Quote:
Originariamente inviato da ginter87 Guarda i messaggi
d'accordo! Comunque non so cosa ho fatto di preciso a parte correggere quell'argv[1] ma non mi da piu quell'errore
hai trovato il problema di memoria.

Quote:
Durante la connect: Connection refused
il tuo client non si connette, potrebbero essere diversi i motivi... come funziona il server?
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2010, 16:07   #8
ginter87
Member
 
Iscritto dal: Apr 2008
Messaggi: 62
ecco il codice

Codice:
#include <stdio.h> // per I/O

#include <stdlib.h> // per exit, malloc, atoi...

#include <unistd.h> // per exec, getpid...

#include <pthread.h> // thread

#include <semaphore.h> //semafori posix

#include <sys/types.h> // standard posix
#include <netinet/in.h>

#include <sys/socket.h> // socket

#include <signal.h> // segnali

#include <string.h>
//manca libreria file 





#include "common.h"

#define totpost 20 

int sd;
int tab[totpost][2];


struct sockaddr_in server_addr;    // struttura dati di configurazione

struct sockaddr_in client_addr;

socklen_t client_len;



int main(int argc, char *argv[])

{

  printf("Server avviato con pid = %d\n", getpid());

int i;
int client_sd[totpost];
int port;


  // preparazione dei dati relativi al bind

  server_addr.sin_family = AF_INET;

  server_addr.sin_port = port;

  server_addr.sin_addr.s_addr = INADDR_ANY;

  client_len = sizeof(struct sockaddr_in);



        printf("inserisci la porta sulla quale accettare connesioni\n");
        scanf("%d",&port);
  	int sd=socket(AF_INET, SOCK_STREAM, 0);
	if(sd<0) 
		{	
 		perror("creazione socket errata!!\n");
		exit(-1);
	 	}

      
  	printf("Effettuo il bind del socket con la porta \n", port);


  	if (bind(sd, (const struct sockaddr *) &server_addr, client_len) < 0)

    		{

      		perror("Durante il bind\n");

      		exit(1);

    		}

  

  	printf("Mi metto in attesa di connessioni sulla porta %d\n", port);

  	if (listen(sd, 20) < 0)		//max 20 client

    		{

      		perror("Durante il listen");

      		exit(1);

    		}



  	printf("Entro nel ciclo infinito in cui accetto connessioni\n");



  	while (1)

    		{
			// itero il tutto cn un ciclo for ke crea un sd dedicato per ogni client accettato
		for(i=0;i<totpost;i++)
		{		

      		
		client_sd[i] = accept(sd, (struct sockaddr *) &client_addr, &client_len);
      		if (client_sd[i] < 0)
      			{
      			perror("Durante l'accept\n");
      			exit(1);
      			}
      		sleep(10);
		
		pid_t pid = fork();
      		if (pid < 0)
      			{
      			perror("errore fork");
      			exit(1);
      			}
      		else if (pid > 0)
      			{
      			close(client_sd[i]);
      			}
      		else
      			{
      			printf("sono il servente: %d\n",getpid());
		      	close(sd);

		      	if (client_sd[i] < 0)

				{

		  			perror("Durante il close\n");

		  			exit(1);

				}

	

		      	printf("Connessione con client accettata sul socket %d\n", client_sd[i]);



// manca una grossa parte di codice ke riguarda la gestione delle send e delle receive e del confronto



	      	printf("Chiudo il socket %d dedicato con il client\n", client_sd[i]);

	      	close(client_sd[i]);
	      	exit(0);

	    	}
	    }

	}
}
ginter87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2010, 17:06   #9
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Quote:
Originariamente inviato da ginter87 Guarda i messaggi
int sd=socket(AF_INET, SOCK_STREAM, 0);
stai inizializzando un socket basato su datagramma.

come ultimo parametro devi usare "IPPROTO_TCP", se vuoi usare TCP
la connect fallisce perchè non trova alcun socket TCP in ascolto...
mi sembra che l'errore sia anche nel client.... controlla, ho guardato velocemente.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2010, 17:38   #10
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4908
Quote:
Originariamente inviato da Teo@Unix Guarda i messaggi
stai inizializzando un socket basato su datagramma.

come ultimo parametro devi usare "IPPROTO_TCP", se vuoi usare TCP
la connect fallisce perchè non trova alcun socket TCP in ascolto...
mi sembra che l'errore sia anche nel client.... controlla, ho guardato velocemente.
Ma che stai dicendo?
Passando 0 decide da solo il protocollo appropriato basandosi sugli altri parametri. Se i parametri sono AF_INET e SOCK_STREAM indovina un po' che protocollo sceglierà? Eh già, TCP.
Per il socket a datagrammi avrebbe dovuto specificare SOCK_DGRAM, non SOCK_STREAM.

Ultima modifica di ||ElChE||88 : 15-01-2010 alle 17:40.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2010, 18:22   #11
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Quote:
Ma che stai dicendo?
Passando 0 decide da solo il protocollo appropriato basandosi sugli altri parametri. Se i parametri sono AF_INET e SOCK_STREAM indovina un po' che protocollo sceglierà? Eh già, TCP.
Per il socket a datagrammi avrebbe dovuto specificare SOCK_DGRAM, non SOCK_STREAM.
oh porca vacca, stavo guardando una cosa e ho risposto ad un'altra.... scusate .... hai ragione ||ElChE||88...
ero convinto di aver visto SOCK_DGRAM
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2010, 18:46   #12
ginter87
Member
 
Iscritto dal: Apr 2008
Messaggi: 62
eh infatti!!!!!
Perciò .. definito che non ho sbagliato nella scelta del protocollo ... dei parametri vari ... secondo voi cosa ho sbagliato?
ginter87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2010, 21:45   #13
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
prova a debuggare anche il server, hai già verificato che il server sia ok? Prova anche ad eseguire tutto in macchina locale prima e su macchine separate poi...
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2010, 22:52   #14
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Ti consiglio un paio di cose.
Quando associ una porta usa la funzione htons(porta), in questo modo ti converte il tuo intero nel valore riconosciuto dalla rete! E poi per la scelta della porta usa sempre un numero superiore a 5000, cioè da 5001 in poi!

Inoltre devi gestire i segnali! Specialmente nel server di sicuro lo ammazzi con CTRL-C! Gestendolo potrai chiudere il descrittore del socket ogni volta e poi uscire!

ti sparo un codice che ho usato un po di tempo fa per prova

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <errno.h>
#include <signal.h>

int sock_ds;

void sigint_handler(){
	close(sock_ds);
	exit(1);
}

int main(int argn, char ** argp){
	sock_ds = socket(AF_INET, SOCK_STREAM, 0);
	if(sock_ds == -1)exit(1);
	signal(SIGINT, sigint_handler);
	struct sockaddr_in server;
	server.sin_family = AF_INET;
	server.sin_port = htons(60000);
	server.sin_addr.s_addr = INADDR_ANY;
	if(bind(sock_ds, (struct sockaddr*)&server, sizeof(server)) == -1){
		perror("Errore binding indirizzo");
		close(sock_ds);
		exit(1);
	}
	if(listen(sock_ds, 4) == -1){
		perror("Errore listen");
		close(sock_ds);
		exit(1);
	}
	struct sockaddr_in client;
	int client_ds;
	int client_size = sizeof(client);
	while(1){
		client_ds = accept(sock_ds, (struct sockaddr*)&client, &client_size);
		if(client_ds == -1)perror("Errore connessione client");
		else{
			//FAI QUELLO CHE TI PARE
		}
	}
}

Ultima modifica di clockover : 15-01-2010 alle 23:15.
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2010, 13:04   #15
ginter87
Member
 
Iscritto dal: Apr 2008
Messaggi: 62
A che pro gestire i segnali?
Comunque ok, anche per il fatto della porta ... ho modificato quel lato ma il mio client continua ad essere rifiutato dal server

Ma se viene rifiutato ... il problema è nel client o nel server?
Ho provato a modificare il tuo codice per adattarlo al mio ... non ho commesso errori ma il mio client continua a non connettersi ... sigh!!!!!!!!!!

Perchè?

La porta è corretta per tutti e due, l'indirizzo, le istruzioni, dovrebbe essere tutto corretto =( mi viene da piangere perche se gia non va bene questo, quando dovrò implementare thread, semafori, file mi sparo come minimo
ginter87 è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2010, 13:58   #16
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Hai provato su macchine separate?
Puoi usare una macchina virtuale.

magari è un qualche problema della tua macchina....

Ultima modifica di Teo@Unix : 16-01-2010 alle 14:05.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2010, 14:06   #17
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Anche eseguendo il mio codice ti da problemi?

Fai una prova... Esegui il mio server e connettiti con telnet

--> telnet localhost 60000

vedi un po se si connette!
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2010, 14:45   #18
ginter87
Member
 
Iscritto dal: Apr 2008
Messaggi: 62
Quote:
Originariamente inviato da Teo@Unix Guarda i messaggi
Hai provato su macchine separate?
Puoi usare una macchina virtuale.

magari è un qualche problema della tua macchina....

è strano però, ho altri codici solo sui socket che ci ha dato il prof ... e non ho mai avuto problemi ad eseguirli sia sulla stessa macchina che in macchine separate comunque ok proverò separatamente
ginter87 è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2010, 14:46   #19
ginter87
Member
 
Iscritto dal: Apr 2008
Messaggi: 62
Quote:
Originariamente inviato da clockover Guarda i messaggi
Anche eseguendo il mio codice ti da problemi?

Fai una prova... Esegui il mio server e connettiti con telnet

--> telnet localhost 60000

vedi un po se si connette!
cioè prendo il codice server tuo ... faccio ./server.c e poi? cioè aaaa scusami non so come connettermi col telnet


cioè so che vuol dire telnet.....
ginter87 è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2010, 15:14   #20
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
No aspe

Codice:
gcc server.c -o server
./server
apri un altro terminale e dai
Codice:
telnet localhost 60000
vedi se almeno si connette, non deve fare proprio nulla ma vedi se si connette!
clockover è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Altro attacco hacker dell'IA: gli agenti...
Stiamo davvero perdendo il controllo del...
Microsoft perde un pilastro: Frank Shaw ...
Diablo V annunciato a sorpresa: il colpo...
Meno di 5 euro per il 5G: l'offerta Kena...
World of Warcraft: Forever è il Classic+...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
Speciale TV in offerta su Amazon: Hisens...
Non c'è pace per Trezor: 347.000 e-mail ...
È un portatile Dell e li vale tut...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 09:39.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v