Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    259

    Inviare e ricevere interi tramite read() e write()

    Ma voi come fate ad inviare interi tramite le socket read() e write()???
    E' un pomeriggio intero che sto provando e mi sto arrendendo

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Usi normalmente la write e la read, solo che passi come parametro l' indirizzo dell' intero con l' operatore &.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,461
    Tu come hai fatto tutto il pomeriggio?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    259
    Tu come hai fatto tutto il pomeriggio?
    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);
    printf("%d",msg); //questa print mi da un risultato diverso da 1

  5. #5

    Moderazione

    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.

  6. #6
    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
    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).
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    259
    Appena provato anche con:
    codice:
    //client
    int msg=1;
    write(sockfd,&msg,sizeof(msg));
    
    //server
    int msg;
    read(client_sockfd,%msg,sizeof(msg));
    printf("%d",msg); //
    il risultato stampato è -65

    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.
    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 azioni

  8. #8
    Cosa restituisce la read? Puoi postare un "SSCCE"?
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    259
    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
    codice:
    #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);
    }
    //client
    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);
    }

  10. #10
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Un errore è qua:

    codice:
    server_address.sin_addr.s_addr = htons(INADDR_ANY);
    La htons serve per cambiare l' ordine dei bit di un valore nell' ordine in cui deve essere inviato.
    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:

    codice:
    server_address.sin_addr.s_addr = INADDR_ANY;
    Questo è un errore, ce ne potrebbero essere altri (posta in tal caso).
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.