Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Siamo tornati nel parco tecnologico di Trieste per il kick-off del programma che mette a disposizione di cinque startup le infrastrutture di ricerca, dal sincrotrone Elettra ai laboratori di genomica e HPC. Roberto Pillon racconta il modello e la visione
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo
HP OMEN MAX 16-ak0001nl combina RTX 5080 Laptop e Ryzen AI 9 HX 375 in un desktop replacement potente e ben raffreddato, con display 240 Hz e dotazione completa. Autonomia limitata e calibrazione non perfetta frenano l'entusiasmo, ma a 2.609 euro è tra le proposte più interessanti della categoria.
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Google ha appena rinnovato la sua celebre serie A con il Pixel 10a, lo smartphone della serie più conveniente se consideriamo il rapporto tra costo e prestazioni. Con il chip Tensor G4, un design raffinato soprattutto sul retro e l'integrazione profonda di Gemini, il colosso di Mountain View promette un'esperienza premium a un prezzo accessibile. E il retro non ha nessuno scalino
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 14-01-2010, 20: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, 20: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, 15: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, 15: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, 15: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, 15: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, 16: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, 17: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, 18: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, 18: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 18:40.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 15-01-2010, 19: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, 19: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, 22: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, 23: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 : 16-01-2010 alle 00:15.
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2010, 14: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, 14: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 15:05.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2010, 15: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, 15: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, 15: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, 16: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


Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo HP OMEN MAX 16 con RTX 5080: potenza da desktop ...
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026 6G, da rete che trasporta dati a rete intelligen...
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso CHUWI CoreBook Air alla prova: design premium, b...
Crollo del mercato PC nel 2026: secondo ...
Come dimostrare che gli agenti di IA fan...
Galaxy AI potrebbe creare app funzionant...
Luce solare anche di notte con i satelli...
The Witcher 4 con ambientazioni da urlo ...
007 First Light e Control Resonant avran...
DLSS 4.5 con Dynamic Multi Frame Generat...
Meta acquisisce Moltbook, il social netw...
Red Hat al MWC 2026: attenzione all'IA n...
Amazon espande 'Paga in Contanti': ora d...
Samsung Galaxy S26 Ultra, promosso ma se...
Gemini sempre più integrato in Go...
NVIDIA investe in Thinking Machines Lab:...
NVIDIA prepara NemoClaw, piattaforma ope...
Samsung testa una batteria da 20.000 mAh...
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: 06:59.


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