Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è uno smartphone che unisce una fotocamera molto più versatile rispetto al passato grazie allo zoom ottico 5x, il supporto magnetico Pixelsnap e il nuovo chip Tensor G5. Il dispositivo porta Android 16 e funzionalità AI avanzate come Camera Coach, mantenendo il design caratteristico della serie Pixel con miglioramenti nelle prestazioni e nell'autonomia. In Italia, però, mancano diverse feature peculiari basate sull'AI.
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
L'abbonamento Ultimate di GeForce NOW ora comprende la nuova architettura Blackwell RTX con GPU RTX 5080 che garantisce prestazioni tre volte superiori alla precedente generazione. Non si tratta solo di velocità, ma di un'esperienza di gioco migliorata con nuove tecnologie di streaming e un catalogo giochi raddoppiato grazie alla funzione Install-to-Play
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-03-2005, 17:42   #1
uffanoia
Junior Member
 
Iscritto dal: Mar 2005
Messaggi: 16
Uffa ..i socket..

Ciao
qualcuno potrebbe dirmi perche' questo stupido programma non va?

in teoria Il client si connette al server che risponde con uno stupido messaggio.

La connessione sembra avvenire,ma il client non stampa quello che dovrebbe

---------------------------------------------------
server.c

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <winsock.h>

#define PORT 12345
#define BL 1024

main() {
int sock, client_len, fd;
char buffer[BL];
struct sockaddr_in server, client;

#ifdef WIN32
WSADATA wsaData;
WSAStartup (0x0101,&wsaData);
#endif


sock = socket(AF_INET, SOCK_STREAM, 0);

if (sock <0) {
perror("creazione del socket fallita");
exit(1);
}


server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY); /* accetta da qualunque sua interfaccia */
server.sin_port = htons(PORT);

if(bind(sock, (struct sockaddr *)&server, sizeof(server)) <0) {
perror("bind socket fallita");
exit(2);
}

listen(sock, 15);


while(1) {
client_len = sizeof(client);
if( (fd=accept(sock, (struct sockaddr *)&client, &client_len))<0) {
perror("accept fallita");
exit(3);
}

printf("Comunicazione in arrivo\n");
sprintf(buffer, "Ciao sono il Server di prova\n\0\0");
write(fd, buffer, strlen(buffer)+1);
close(fd);
}
}

---------------------------------------------------------------------------

Client.c

#include <winsock.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#define PORT 12345
#define BL 1024

main(argc, argv) int argc; char *argv[]; {
int sock, server_len, count;
char buffer[BL];
struct hostent *host;
struct sockaddr_in server, client;

#ifdef WIN32
WSADATA wsaData;
WSAStartup (0x0101,&wsaData);
#endif

sock = socket(AF_INET, SOCK_STREAM, 0);

if (sock <0) {
perror("creazione del socket fallita");
exit(1);
}

host = gethostbyname(argv[1]);
if(host == NULL) {
perror("host inesistente");
exit(2);
}

server_len = sizeof server;
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr=htonl(INADDR_ANY);

memcpy(&server.sin_addr.s_addr, host->h_addr, host->h_length);


if(connect(sock, (struct sockaddr *)&server, sizeof(server))<0){
perror("Errore connect");
exit(3);
}

printf("Connessione Fatta\n");

while((count=read(sock, buffer, BL))>0) {
printf("%d %s\n", count, buffer);
}

close(sock);

}

-------------------------------------

grazie
ciao

Uffanoia
uffanoia è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2005, 18:27   #2
Fenomeno85
Senior Member
 
L'Avatar di Fenomeno85
 
Iscritto dal: Jun 2002
Città: Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
server
Codice:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <winsock.h>

#define PORT 12345
#define BL 1024
#define localhost "127.0.0.1"

int main() {
        int sock, client_len, fd;
        char buffer[BL];
        struct sockaddr_in sad, cad;

#ifdef WIN32
       WSADATA wsaData;
       WSAStartup (0x0101,&wsaData);
#endif
       memset ((char*)&sad,0,sizeof(sad));
	   sad.sin_family = AF_INET;
	   sad.sin_addr.s_addr = inet_addr(localhost);
	   sad.sin_port = htons ((u_short)PORT);
       sock = socket(PF_INET, SOCK_STREAM, 0);
       if (sock <0) {
          perror("creazione del socket fallita");
          exit(1);
       }
       if(bind(sock, (struct sockaddr *)&sad, sizeof(sad)) <0) {
          perror("bind socket fallita");
          exit(2);
      }
      
      listen(sock, 15);
      while(1) {
          printf ("\nIn attesa di client\n");
          client_len = sizeof(cad);     
          if( (fd=accept(sock, (struct sockaddr *)&cad, &client_len))<0) {
              perror("accept fallita");
              exit(3);
          }
          printf("Comunicazione in arrivo\n");
          char string[] = "Ciao sono il server di prova.\n";
          send (fd, string, sizeof (string), 0); 
          closesocket (fd);
      }
      closesocket(sock);
}
client
Codice:
#include <winsock.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#define PORT 12345
#define BL 1024
#define localhost "127.0.0.1"

int main(int argc, char* argv[]) {
int sock, server_len, count;
char buffer[BL];
struct hostent *host;
struct sockaddr_in server, client;

#ifdef WIN32
WSADATA wsaData;
WSAStartup (0x0101,&wsaData);
#endif

sock = socket(PF_INET, SOCK_STREAM, 0);

if (sock <0) {
perror("creazione del socket fallita");
exit(1);
}

host = gethostbyname(argv[1]);
if(host == NULL) {
perror("host inesistente");
exit(2);
}

server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(localhost);
server.sin_port = htons ((u_short)PORT);

if(connect(sock, (struct sockaddr *)&server, sizeof(server))<0){
perror("Errore connect");
exit(3);
}

printf("Connessione Fatta\n");

while((count=recv(sock, buffer, sizeof(buffer),0))>0) {
printf("%d %s\n", count, buffer);
}

closesocket(sock);
system ("PAUSE");
return (EXIT_SUCCESS);
}
~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio.
Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso
Fenomeno85 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2005, 18:39   #3
tglman
Senior Member
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
guardando il codice velocemente ho notato che per inviare e ricevere i dati usi read e write, che non è del tutto sbagliato, ma il dubbio mi viene perche quelle funzioni si usano per scrivere i file a basso livello senza buffer(ogni chiamata corrisponde ad un accesso diretto al disco), e quindi non so con certezza se funzioni o meno, io ti consilio di usare le funzioni send e recv che funzionano sicuramente.

send(int socket,voids * buff,int buflen,int fleg)//per inviare normalmente puoi impostare il flag a 0

recv(int socket,voids * buff,int buflen,int fleg)//per ricevere normalmente puoi impostare il flag a 0
tglman è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2005, 18:51   #4
uffanoia
Junior Member
 
Iscritto dal: Mar 2005
Messaggi: 16
Grazie!!
Ora funziona perfettamente !

Ma per cosa sta PF_INET ?
--
La funzione che ho usato

memcpy(&server.sin_addr.s_addr, host->h_addr, host->h_length);

e' Inutile?

---
memset ((char*)&sad,0,sizeof(sad));

cancella la "struttura"? perche' bisogna farlo prima se subito dopo la si "riempie"?

---

Perchè l'uso di read e write non sono corrette?

--

Al posto di send e recv si potrebbero usare
sendto() e

recvfrom()?

---

ciao
uffanoia
uffanoia è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2005, 19:03   #5
Fenomeno85
Senior Member
 
L'Avatar di Fenomeno85
 
Iscritto dal: Jun 2002
Città: Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
PF_INET sta per il protocollo va bene anche AF_INET ... ma logicamente sarebbe meglio scrivere il primo nella creazione del socket.

memcpy che hai fatto va bene se vuoi usare gethostbyname te lo ho tolto per velocità mia.

cancellare la struttura è per la compatibilità con la struttura sockaddr. si è discusso un paio di giorni fa.

sendto e recvfrom dovrebbero forse andare mai provato

~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio.
Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso
Fenomeno85 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2005, 19:20   #6
uffanoia
Junior Member
 
Iscritto dal: Mar 2005
Messaggi: 16
Ok ,tutto chiaro
grazie mille!

Buona giornata
Ciao

uffanoia
uffanoia è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2005, 19:21   #7
Fenomeno85
Senior Member
 
L'Avatar di Fenomeno85
 
Iscritto dal: Jun 2002
Città: Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
de nada

~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio.
Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso
Fenomeno85 è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2005, 10:51   #8
pavimento
Member
 
Iscritto dal: Mar 2005
Messaggi: 41
ciao

secondo me per usare read e write devi condividere il buffer mettendolo in un .h

Gia' che ci sono chiedo..

Ma se invece di un messaggio stringa volessi rispondere con un intero come faccio visto che il buffer è dichiarato char * , e lo devo passare a send e recv come char *?

La funzione select() a cosa serve?

Se voglio mandare messaggi in broadcast,o mandare messaggi a piu client, come devo fare/cosa devo usare?
pavimento è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2005, 11:00   #9
Fenomeno85
Senior Member
 
L'Avatar di Fenomeno85
 
Iscritto dal: Jun 2002
Città: Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
un modo sarebbe quello di usare una union

~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio.
Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso
Fenomeno85 è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2005, 12:50   #10
uffanoia
Junior Member
 
Iscritto dal: Mar 2005
Messaggi: 16
Ciao,
Per gli interi con union funziona sicuramente.

per la select www.lilik.it/~mirko/gapil/gapilsu251.html

Per il broadcast credo si debba usare UDP,eliminando accept(),connect() e utilizzando solo sendto e recvfrom().

ciao

uffanoia
uffanoia è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2005, 13:04   #11
Futuregames
Senior Member
 
Iscritto dal: Mar 2005
Messaggi: 349
scusate io nn ho mai capito a cosa serve il socket?
Futuregames è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2005, 13:31   #12
pavimento
Member
 
Iscritto dal: Mar 2005
Messaggi: 41
grazie
e quindi che differenze ci sono con udp(che è poi sto udp?)?
non esiste alcun modo(corretto) per usare read e write invece di send e recv?
pavimento è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2005, 14:24   #13
uffanoia
Junior Member
 
Iscritto dal: Mar 2005
Messaggi: 16
Allora..molto velocemente ..grosso modo..

Un socket è definita come l'stremita' di un canale di comunicazione.
Una coppia di processi che comunica attraverso una rete usa una coppia di socket,una per ogni processo,e ogni socket è identificata da un indirizzo IP concatenato a un numero di porta.
Le architetture client-server sono implementate ,solitamente,usando le socket.
Il server attende le richieste dei client ,stando in ascolto sulle porte;quando riceve una richiesta ,se accetta la connessione proveniente dalla socket del client ,si stabilisce la comunicazione.

La differenza è appunto è eliminare accept(),connect() e utilizzare solo sendto() e recvfrom().

Non so se esiste un modo per usare read e write,ma credo di si.
comunque funzionano benissimo anche send e recv .
Comunque se trovi un modo potresti postarlo..

ciao
uffanoia
uffanoia è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2005, 17:21   #14
pavimento
Member
 
Iscritto dal: Mar 2005
Messaggi: 41
Ma se volessi contattare piu client con i socket normali non
si potrebb
e fare un ciclo for nella chiamata socket();

for(i=0;I<n;i++){
sock = socket(PF_INET, SOCK_STREAM, 0);

}

in questo modo ci sarebbe un socket per ogni client.O no?
pavimento è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2005, 17:42   #15
Fenomeno85
Senior Member
 
L'Avatar di Fenomeno85
 
Iscritto dal: Jun 2002
Città: Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
dovresti creare dei figli

~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio.
Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso
Fenomeno85 è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2005, 18:20   #16
pavimento
Member
 
Iscritto dal: Mar 2005
Messaggi: 41
utilizzando la fork()?

quindi come verrebbe?

while(1){
...
..
pid=fork();
if(pid==0){
fai_quello_che_devi-fare;

}

else close}

invia_risposta();}

???
pavimento è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2005, 18:47   #17
tglman
Senior Member
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
Se si leggono le specifiche delle funzioni read è write, queste vanno ad eseguire un accesso diretto al dispositivo senza alcun buffer o cosa del genere, il socket invece possiede un buffer dove vengono scritti e letti i dati, quindi non si possono utilizzare funzioni non bufferizate su buffer e le read e write non funzionano, come invece funzionano le FileRead e FileWrite di windows.

Ciao..
tglman è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2005, 19:48   #18
pavimento
Member
 
Iscritto dal: Mar 2005
Messaggi: 41
Ma in teoria essendo

int read(int fildes,void* buf,size_t nbyte);

Legge n bytes dal file associato a fildes copiandoli nella zona di memoria a partire dall'indirizzo "buf";restituisce il numero di bytes effettivamente letti.

int write(int fildes,const void* buf,size_t nbyte);

Scrive nbyte nel file associato a "fildes" copiandoli nella zona di memoria a partire dall 'indirizzo "buf";restituisce il numero di bytes scritti.

dovrebbero leggere/scrivere i bytes dal/nel contenuto di buf.
Quindi se uso una write scrivo nel buffer e per leggerlo uso una read.Non capisco perche' non possa andare bene?
?????
pavimento è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2005, 16:01   #19
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Per Windows devi usare send e recv...per Linux puoi usare send e recv o read e write...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2005, 18:45   #20
pavimento
Member
 
Iscritto dal: Mar 2005
Messaggi: 41
ah ho capito
grazie
ciao
pavimento è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy? Google Pixel 10 è compatto e ha uno zoom ...
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
Iliad: si consolida la partnership tecno...
Il SoC a 2 nm di Samsung non sfigura nel...
Prezzo shock per i Galaxy Buds FE + nuov...
Il nuovo SoC di Qualcomm vuole stupire: ...
Offerta lampo per pulire l'auto: aspirap...
I robotaxi di Amazon entrano in azione: ...
ECOVACS DEEBOT T50 PRO OMNI Gen2 domina ...
iPhone 17 Pro su Amazon: tutti i colori,...
Disney Plus da 2,99 euro al mese per 3 m...
Nuovo test di accensione dei motori per ...
Novità dalle analisi dell'asteroi...
La PS6 sarà più potente del previsto: ec...
Sony svela Xperia 10 VII: è il nu...
Amazon Weekend da urlo: iPhone 16 a prez...
Spotify diffida ReVanced: chiesta la rim...
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: 16:44.


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