Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
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: 4907
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: 4907
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


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
Alcune partite NBA saranno trasmesse in ...
Intel Core 13000 e 14000 aumentano uffic...
Gemini sta per arrivare in Google Maps: ...
2 minuti per vedere le 27 offerte imperd...
Ray-Ban Meta Display: tecnologia sorpren...
Un mini PC a prezzo stracciato, non cerc...
Al via i coupon nascosti di ottobre: qua...
Ferrari Elettrica si aggiorna solo in of...
Doppio sconto sugli smartphone top Xiaom...
Samsung è sempre più prota...
ChatGPT ha pregiudizi politici? Ecco cos...
Un solo iPhone rubato ha portato alla sc...
Xiaomi 17 Ultra sta arrivando: ecco come...
Il Motorola Edge 70 non ha più se...
Alcuni Galaxy S26 utilizzeranno il chip ...
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: 15:20.


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