Ma voi come fate ad inviare interi tramite le socket read() e write()???
E' un pomeriggio intero che sto provando e mi sto arrendendo
Ma voi come fate ad inviare interi tramite le socket read() e write()???
E' un pomeriggio intero che sto provando e mi sto arrendendo
Usi normalmente la write e la read, solo che passi come parametro l' indirizzo dell' intero con l' operatore &.
Tu come hai fatto tutto il pomeriggio?
No MP tecnici (non rispondo nemmeno!), usa il forum.
Le ho provate di in tutti i modi, o almeno in tutti i modi che conoscevo.Tu come hai fatto tutto il pomeriggio?
Praticamente se passo come parametro il puntatore dell'intero non mi da l'intero ma un numero assurdo tipo -193484564 insomma nientea che vedere con un semplice 1 o 2 che vorrei passare tra write e read.
codice://client int msg=1; write(sockfd,&msg,1); //server int msg; read(client_sockfd,&msg,1); printf("%d",msg); //questa print mi da un risultato diverso da 1
Nel titolo della discussione deve essere sempre presente tra parentesi quadre il tag del linguaggio di riferimento; questa volta l'ho aggiunto io, in futuro ricordati di metterlo fin da subito.
Amaro C++, il gusto pieno dell'undefined behavior.
Alla read e alla write devi passare le dimensioni (in byte) di ciò che deve scrivere, e un intero non è grande un solo byte; riprova mettendo come terzo parametro sizeof(msg).Originariamente inviato da Fix87
Le ho provate di in tutti i modi, o almeno in tutti i modi che conoscevo.
Praticamente se passo come parametro il puntatore dell'intero non mi da l'intero ma un numero assurdo tipo -193484564 insomma nientea che vedere con un semplice 1 o 2 che vorrei passare tra write e read.
codice://client int msg=1; write(sockfd,&msg,1); //server int msg; read(client_sockfd,&msg,1); print("%d",msg); //questa print mi da un risultato diverso da 1
Amaro C++, il gusto pieno dell'undefined behavior.
Appena provato anche con:
il risultato stampato è -65codice://client int msg=1; write(sockfd,&msg,sizeof(msg)); //server int msg; read(client_sockfd,%msg,sizeof(msg)); printf("%d",msg); //
Mi devi scusare ma mi è proprio sfuggito di mente dato che non so più che pesci prendere per questa cavolata che mi interrompe il progetto e quindi non rispondo più delle mie azioniNel titolo della discussione deve essere sempre presente tra parentesi quadre il tag del linguaggio di riferimento; questa volta l'ho aggiunto io, in futuro ricordati di metterlo fin da subito.
Cosa restituisce la read? Puoi postare un "SSCCE"?
Amaro C++, il gusto pieno dell'undefined behavior.
La read restituisce -1 e non so proprio perchè.
Per SSCCE sarebbe un piccolo pezzetto di codice funzionante?
Eccolo proprio quello che uso io.
//server
//clientcodice:#include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<netdb.h> #include<errno.h> #include<string.h> //#include "funzioniserver.h" int main (int argc, char *argv[]){ char msg; char ricevere[50], inviare[50]; int server_sockfd; int client_sockfd; int rc ; unsigned client_len; struct sockaddr_in server_address; struct sockaddr_in client_address; int a; server_sockfd = socket(AF_INET, SOCK_STREAM, 0); server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = htons(INADDR_ANY); server_address.sin_port = htons(7734) ; rc = bind(server_sockfd, (struct sockaddr *) &server_address, sizeof(server_address)); rc = listen(server_sockfd, 10); client_len=sizeof(client_address); client_sockfd=accept(server_sockfd, (struct sockaddr *) &client_address, &client_len); read(client_sockfd,&msg,sizeof(msg)); printf("%d\n",msg); close(client_sockfd); }
codice:#ifdef HAVE_CONFIG_H #include <config.h> #endif #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include "funzioniclient.h" int main(int argc, char *argv[]) { int sockfd, len, result; struct sockaddr_in address; char ricevere[50], inviare[50]; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("\n\nCreazione del socket fallita.\n\n") ; return -1 ; } address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr(argv[1]); address.sin_port = htons(7734); len = sizeof(address); result=connect(sockfd, (struct sockaddr *)&address, len); if(result == -1) { perror("\n\nErrore di connessione\n\n"); exit(-1); } int sockfd, a, b='n', scelta, int msg; scanf("%d",&scelta) switch (scelta){ case 0: /*Usicta dal login*/ printf("\n\nArrivederci!\n\n"); msg=0; write(sockfd,&msg,sizeof(msg)); break; case 1:/*Accesso con autenticazione*/ msg=1; a=send(sockfd,&msg,sizeof(msg)); if(a<0) printf("\n%d\n",a); break; case 2:/*Accesso senza autenticazione*/ msg=2; a=send(sockfd,&msg,sizeof(msg)); if(a<0) printf("\n%d\n",a); break; } close(sockfd); }
Un errore è qua:
La htons serve per cambiare l' ordine dei bit di un valore nell' ordine in cui deve essere inviato.codice:server_address.sin_addr.s_addr = htons(INADDR_ANY);
sin_addr.s_addr non è un dato che deve essere inviato, è una costante che ti restituisce un indirizzo IP valido, per cui non c'è bisogno di alcuna conversione:
Questo è un errore, ce ne potrebbero essere altri (posta in tal caso).codice:server_address.sin_addr.s_addr = INADDR_ANY;
Ma faresti bene a gestire gli errori, ovvero ogni volta che usi funzione come la socket, la bind, ecc ... controlla che il valore ritornato non sia minore di zero, se è minore di zero usa perror per stampare l' errno ottenuto.