Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 05-06-2010, 12:25   #1
Tony Hak
Senior Member
 
L'Avatar di Tony Hak
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
[C] collegamento Server Client

Buongiorno a tutti !
Ho il seguente problema: non riesco a far comunicare il server col client (il client dovrebbe visualizzare l'ora e la data inviati dal server). Il client è rappresentato da un altro pc collegato in Lan col server. Tutto avviene in ambiante UNIX. Il codice in questione del server è il seguente :

Codice:
#include <sys/socket.h>
#include <sys/un.h>
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <netinet/in.h>


#define SOCKET_NAME "/tmp/my_first_socket"
static int gestisci(int);
int main(int argc, char **argv)
{
  	int listen_sd, connect_sd; // Socket descriptor
  	struct sockaddr_un my_addr  , client_addr;
  	socklen_t client_len;
  	my_addr.sun_family = PF_INET;
  	strcpy(my_addr.sun_path, SOCKET_NAME);
  
	// Server section: create a local socket
  	if ( (listen_sd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
    	perror("socket"), exit(1);

	// remove socket file if present
  	unlink(SOCKET_NAME);
                                      
  	// bind socket to pathname

//if  ( ( bind ( listen_sd, ( struct sockaddr_in ( 3000, inet_aton ( "127.0.0.1" ) ) ) &my_addr, sizeof ( my_addr ) ) < 0 ) )
 // perror("bind"), exit(1);

if ( bind(listen_sd, (struct sockaddr *) &my_addr, sizeof(my_addr)) < 0)
perror("bind"), exit(1);


  
	// put socket in listen state
  	if ( listen(listen_sd, 1) < 0)
    	perror("listen"), exit(1);
  	while (1) {
    		client_len = sizeof(client_addr);
     		fprintf(stderr, " sizeof(client_addr)=%d \n", client_len);
    		if ( (connect_sd = accept(listen_sd, (struct sockaddr *) &client_addr, 			&client_len)) < 0)
      			perror("accept"), exit(1);
    		fprintf(stderr, " new connection \n");
    		fprintf(stderr, " client address: %100s\n ", client_addr.sun_path);
    		
		// handle the connection
    		gestisci(connect_sd);
    		close(connect_sd);
  		}
  	return 0;
}

int gestisci(int sd)
{
  char buf[100];
  int n;
  time_t ora;
  time(&ora);
  printf(" Ora: %s\n", ctime_r(&ora, buf));
  printf(" Ora: %d\n", strlen(buf));
  write(sd, buf, 26);
  return 0;
}
dove sbaglio ? grazie mille
__________________
Tony Hak è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2010, 10:51   #2
Tony Hak
Senior Member
 
L'Avatar di Tony Hak
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
up .. non posso mettere il codice del client perche è sul pc del mio amico ... ma quello sembra che funzioni in quanto si mette in attesa del server.
__________________
Tony Hak è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2010, 21:31   #3
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Quote:
Originariamente inviato da Tony Hak Guarda i messaggi
up .. non posso mettere il codice del client perche è sul pc del mio amico ... ma quello sembra che funzioni in quanto si mette in attesa del server.
il client si mette in attesa? non credo. Chi deve essere preventivamente messo in attesa è semmai il server. Dopo di che si avvia il client.

Puoi specificare l'errore che hai? Così non saprei da dove cominciare...
Semmai può esserti utile scriverti un semplice client base per fare debugging... oppure puoi usare telnet, ma solo per verificare che la connessione avviene...
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2010, 11:58   #4
Tony Hak
Senior Member
 
L'Avatar di Tony Hak
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
abbiamo usato un altro codice. Ecco il codice del server :

Codice:
/* A simple server in the internet domain using TCP
   The port number is passed as an argument */

#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <netinet/in.h>

void error(char *msg)
{
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{
     int sockfd, newsockfd, portno, clilen;
     char buffer[256];
     struct sockaddr_in serv_addr, cli_addr;
     int n;
     if (argc < 2) {
         fprintf(stderr,"ERROR, no port provided\n");
         exit(1);
     }
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0) 
        error("ERROR opening socket");
     bzero((char *) &serv_addr, sizeof(serv_addr));
     portno = atoi(argv[1]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);
     if (bind(sockfd, (struct sockaddr *) &serv_addr,
              sizeof(serv_addr)) < 0) 
              error("ERROR on binding");
     listen(sockfd,5);
     clilen = sizeof(cli_addr);
     newsockfd = accept(sockfd, 
                 (struct sockaddr *) &cli_addr, 
                 &clilen);
     if (newsockfd < 0) 
          error("ERROR on accept");
     bzero(buffer,256);
     n = read(newsockfd,buffer,255);
     if (n < 0) error("ERROR reading from socket");
     printf("Here is the message: %s\n",buffer);
     n = write(newsockfd,"I got your message",18);
     if (n < 0) error("ERROR writing to socket");
     return 0; 
}
lo avviamo con riga di comando della shell di linux specificando la porta. Es "./server.out 5300"

ecco il codice del client:

Codice:
#include <netdb.h>
#include <stdlib.h>
#include <sys/types.h> 

#include <sys/socket.h>

#include <netinet/in.h>

#include <sys/un.h>

#include <time.h>

#include <stdio.h>

#include <unistd.h>

#include <errno.h>

#include <string.h>

#include <fcntl.h>

#include <sys/stat.h>





void error(char *msg)
{
    perror(msg);
    exit(0);
}

int main(int argc, char *argv[])
{
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    char buffer[256];
    if (argc < 3) {
       fprintf(stderr,"usage %s hostname port\n", argv[0]);
       exit(0);
    }
    portno = atoi(argv[2]);
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) 
        error("ERROR opening socket");
    server = gethostbyname(argv[1]);
    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);
    serv_addr.sin_port = htons(portno);
    if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0) 
        error("ERROR connecting");
    printf("Please enter the message: ");
    bzero(buffer,256);
    fgets(buffer,255,stdin);
    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
         error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);
    return 0;
}
il client lo eseguiamo con riga di comando specificando il nome dell'host e la porta . Es: "./client.out nomehost 5300"

il programma doivrebbe inviare un messaggio al server specificato dal processo del client.

Il problema è che il tutto funziona solo in localhost. Non riusciamo quindi a far comunicare due macchine. L'errore del client è il seguente : NO SUCH HOST.
Grazie per l'aiuto
__________________
Tony Hak è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2010, 21:29   #5
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Intendi dire che fallisce in questo punto?
Quote:
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
oppure intendi il valore di errno? Semmai controlla anche il valore di errno quando hai l'errore...

se la funzione riportata sopra fallisce può essere che non riesci a risolvere il nome, puoi fare due prove in questo caso, provare con l'indirizzo al posto del nome "./client.out 192.168.y.z 5300"(e se funziona vuol dire che è il nome non risolto) e verificare l'elenco dei server DNS sul tuo computer. Che se il server DHCP è configurato correttamente dovrebbe già essere a posto.

Errno in caso la funzione sopra fallisce avrà uno dei valori seguenti:
HOST_NOT_FOUND,
NO_ADDRESS or NO_DATA ,
NO_RECOVERY,
TRY_AGAIN
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 08-06-2010, 11:29   #6
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Quote:
Originariamente inviato da Teo@Unix Guarda i messaggi
e verificare l'elenco dei server DNS sul tuo computer. Che se il server DHCP è configurato correttamente dovrebbe già essere a posto.
Che bigolo che sono, in rete locale non ti serve controllare i DNS, a meno che tu abbia un server DNS a casa . Ragionavo come se fossi in azienda, il nome dovrebbe comunque risolversi se il file /etc/hosts è configurato correttamente .. prova usando l'indirizzo intanto...

un esempio di file hosts è il seguente (non c'è nessun altro pc oltre localhost, in questo modo la risoluzione non avviene, aggiungi righe dove ho commentato con gli abbinamenti necessari)
Codice:
~# cat /etc/hosts
127.0.0.1       localhost
127.0.1.1       backtrack bt
# Put here ...

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
......
dacci un occhio ... se può essere questo il problema ...
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
Sony conferma l'uso di AI generativa sui...
Le sfere metalliche trovate in Australia...
Intel cambia i piani? Il processo 14A2 p...
La missione spaziale cinese Tianwen-2 ha...
Eni porta la produzione di batterie in I...
Il Dipartimento dell'Energia USA cancell...
MSI è pronta per le DDR5 cinesi a...
La sonda spaziale JAXA Hayabusa2 ha sorv...
L'Università di Sydney e IBM scop...
Credono di parlare con Microsoft e l'FTC...
Microsoft vede grandi profitti nella con...
Niente 'scatola vuota': ecco perch&eacut...
Microsoft annuncia 4800 licenziamenti: X...
Sky acquisisce la divisione media di ITV...
Chi studia con ChatGPT poi dimentica qua...
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: 22:31.


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