Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it L'avatar di ccs
    Registrato dal
    Jan 2007
    Messaggi
    16

    problemi con il codice del client in linux

    Ecco il codice:
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <errno.h>
    #define SOCKET_ERROR ((int)-1)

    char A[100];
    char B[100];
    char user[] = "Alessandra,Raffoni,0000240469";
    char buf[100];
    char msg[100];
    int port, len, nread, nwrite, n, sd, i, value;
    char h;
    char* servizio;

    typedef union {
    int value;
    char p_value[4];
    } byte_msg;
    int main(int argc, char **argv) {
    struct hostent* host;
    struct sockaddr_in cliaddr, servaddr;
    byte_msg N;
    char ris[3];

    if (argc != 4) {
    printf("Error: %s serverAddress serverPort message\n", argv[0]);
    exit(1);
    }
    else {
    memset((char *)&servaddr, 0, sizeof(struct sockaddr_in));
    servaddr.sin_family = AF_INET;
    host = (struct hostent *)gethostbyname(argv[1]);
    if (host == NULL) {
    printf("%s not found in /etc/hosts\n", argv[1]);
    exit(1);
    }
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(argv[2]);
    servaddr.sin_addr.s_addr = inet_addr(inet_ntoa(*((struct in_addr*)host->h_addr)));

    sd = socket(AF_INET, SOCK_STREAM, 0);

    /* Punto 2. */
    if (sd < 0) {
    perror("apertura socket");
    exit(1);
    }
    printf("Client: creata la socket sd=%d\n", sd);
    if (connect(sd, (struct sockaddr *)&servaddr, sizeof(struct sockaddr)) < 0) {
    perror("connect");
    exit(-1);
    }
    printf("Client: connect ok\n");

    /* Punto 3.*/
    len = 10;
    nread = 0;
    while ((len > nread) && ((n = read(sd, &(buf[nread]), len - nread)) > 0)) {
    nread += n;
    printf("readeffettuata, risultato n=%d len=%d nread=%d len-nread=%d\n", n, len, nread, len-nread);
    fflush(stdout);}
    /* Punto 4.*/
    strcat(A, user);
    len = strlen(A);
    strcpy(B, A);

    len = strlen(B);
    for (i = len; i < 100; i++) {
    B[i] = ' ';}
    len = strlen(argv[3]) + 1;
    nwrite = 0;
    while ((n = write(sd, &(msg[nwrite]), len - nwrite)) > 0)
    nwrite += n;

    /* Punto 5.*/
    len = strlen(argv[3]);
    write(sd, &len, sizeof(int));
    N.value = value;

    printf("value = %s\n", N.value);N = strlen(msg); /* CONTROLLA QUI!!! cosa sarebbe messaggiodiprova? nn è mai inizializzato*/

    /* Punto 6. */
    len = strlen(msg) + 1;
    nwrite = 0;
    while ((n = write(sd, &(msg[nwrite]), len - nwrite)) > 0)
    nwrite += n;

    /* Punto 7. */while ((len>nread) && ((n = read(sd, &(buf[nread]), len - nread)) > 0)) {
    nread += n;printf("readeffettuata, risultato n=%d len=%d nread=%d len-nread=%d\n", n, len, nread, len - nread);
    fflush(stdout);}
    ris[2] = '\0';
    /* Punto 8. */
    printf("Risultato dal server: ");
    printf(ris);

    /* Punto 9. */
    close(sd);exit(0);
    return(0);
    }
    } //main

    Gli errori sn i seguenti:

    progClient.c:44: warning: passing argument 1 of 'htons' makes integer from pointer without a cast
    progClient.c:45: error: dereferencing pointer to incomplete type
    progClient.c:90: error

    vorrei mettere in allegato anke il testo ma è tropo grande! provate a capirci di qui!

  2. #2
    Utente di HTML.it L'avatar di ccs
    Registrato dal
    Jan 2007
    Messaggi
    16

    scordavo che...

    ...va caricato poi alla fine il server ke mi ha dato il prof e testarlo km da consegna ma questo ci penso io!! Grazie!

  3. #3
    Per quanto riguarda l'errore alla riga 44, la funzione htons prevede che gli passi un intero, e non una stringa come stai facendo. argv infatti è un array di puntatori a stringhe, per cui lui ti dice che sta facendo un cast da puntatore a intero. Per risolvere ciò converti la stringa contenuta in argv[2] in un intero, con la funzione atoi() .

    Per l'altro errore alla riga 90 forse se metti in evidenza quale è la riga è piu semplice trovarlo, perché contare le righe per capire quale è la 90 è un po'... noioso


  4. #4
    Utente di HTML.it L'avatar di ccs
    Registrato dal
    Jan 2007
    Messaggi
    16

    errore riga 90 e ...

    N = strlen(msg); //ecco l'errore

    Scusa ma nn ho capito km risolvere i problemi ke hai detto prima!! (scusa nn sn molto brava a fare client)!!

  5. #5
    Cercherò di essere piu chiaro.

    argv[] è definito come char**. Questo vuol dire che è una matrice di caratteri, che puoi vedere anche come un array di stringhe. accedere ad argv[2] significa accedere alla stringa di indice 2 nell'array. ma quello che è importante è che sono stringhe.

    La funzione htons() invece accetta un parametro di tipo u_short (tipo intero short senza segno).

    Quello che nn puoi fare è passare una stringa a una funzione ceh accetta un intero.
    Il compilatore ti avvisa che per dare la stringa alla funzione dovrà fare un cast (cioè cambiare il tipo del parametro) da char* a int (cioè da puntatore a intero).

    Tipicamente con una conversione di questo tipo ti ritrovi con dei valori che non significano niente il che rende inconsistente il programma che stai facendo.

    Devi quindi trasformare la stringa in un valore intero prima di passarla ad htons(). per fare ciò puoi utilizzare la funzione atoi() e devi anche castare il tipo intero cosi ricevuto in un tipo u_short.

    codice:
    serveraddr.sin_port=htons((u_short)atoi(argv[2]));
    Per l'altro errore cosi a occhio penso a un problema di assegnazione di un valore intero a una union, ma potrei sbagliarmi. Posta l'errore completo che ti da in quel punto e cerchiamo di capire.


  6. #6
    Utente di HTML.it L'avatar di ccs
    Registrato dal
    Jan 2007
    Messaggi
    16

    re

    grazie mille dell'aiuto!!

    Ecco tutti gli errori ke mi dà!

    progClient.c: In function 'main':
    progClient.c:44: error: 'serveraddr' undeclared (first use in this function)
    progClient.c:44: error: (Each undeclared identifier is reported only once
    progClient.c:44: error: for each function it appears in.)
    progClient.c:45: error: dereferencing pointer to incomplete type
    progClient.c:90: error: incompatible types in assignment

    /* Punto 5.*/
    len = strlen(argv[3]);
    write(sd, &len, sizeof(int));
    N.value = value;

    printf("value = %s\n", N.value);
    N = strlen(msg); /* riga 90*/

  7. #7

    Re: re

    Originariamente inviato da ccs

    progClient.c: In function 'main':
    progClient.c:44: error: 'serveraddr' undeclared (first use in this function)
    progClient.c:44: error: (Each undeclared identifier is reported only once
    progClient.c:44: error: for each function it appears in.)
    progClient.c:45: error: dereferencing pointer to incomplete type
    la tua variabile si chiama servaddr, e io l'ho chiamata serveraddr
    quindi scrivi :
    codice:
    servaddr.sin_port=htons((u_short)atoi(argv[2]));
    progClient.c:90: error: incompatible types in assignment

    /* Punto 5.*/
    len = strlen(argv[3]);
    write(sd, &len, sizeof(int));
    N.value = value;

    printf("value = %s\n", N.value);
    N = strlen(msg); /* riga 90*/
    Confermo che per questo stai sbagliando i tipi nelle assegnazioni, perché stai assegnando un tipo int a un tipo union, quindi al massimo devi scegliere a quale campo della union assegnare quel valore (che deve essere ovviamente un intero).


  8. #8
    Utente di HTML.it L'avatar di ccs
    Registrato dal
    Jan 2007
    Messaggi
    16

    re

    scusa ma il fatto è ke nn capisco molto come funzioni la unio! grazie ankora dell'aiuto!!

    Ancora la riga 45 da errore

    progClient.c:45: error: dereferencing pointer to incomplete type

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465

    Moderazione

    Originariamente inviato da ccs
    ...va caricato poi alla fine il server ke mi ha dato il prof e testarlo km da consegna ma questo ci penso io!! Grazie!
    Hai dimenticato anche il linguaggio nel titolo, obbligatorio come da Regolamento.

    Suppongo si tratti di C++, lo correggo io, in caso contrario avvertimi.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #10
    Utente di HTML.it L'avatar di ccs
    Registrato dal
    Jan 2007
    Messaggi
    16

    correggo la lamentela

    No è c in linux. programmazione tramite vim (c puro) di linux!!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.