Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di mr.and
    Registrato dal
    Dec 2008
    Messaggi
    51

    [C]problemi relativi a <CRLF> in trasmissione tramite socket

    Salve,
    sto cercando di implementare un server su s.o. Windows connesso su socket.
    I messaggi che questo server riceve terminano con il carattere <CRLF> che sarebbe equivalente a \r\n.
    Perciò il client crea una messaggio e lo spedisce così:

    codice:
    addr.sin_family = AF_INET; 
    addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    addr.sin_port = htons(port); 
    clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    char* messaggio="CIAO\r\n";
    send(clientsocket,messaggio,sizeof(messaggio),0);
    dall'altra parte il server riceve il messaggio con recv:

    codice:
    recv(connessione, risposta, sizeof(risposta), 0);
    ma andando a leggere risposta carattere per carattere incontro dei problemi:

    ipotizziamo che in risposta[i] dovrebbe trovarsi \r: l'espressione risposta[i]=='\r' ha valore 0!!
    la stessa cosa vale per \n.

    Dove sbaglio? come posso fare per riconoscere questo benedetto <CRLF>?

    ringrazio in anticipo tutti!

    Saluti

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466

    Re: [C]problemi relativi a <CRLF> in trasmissione tramite socket

    Originariamente inviato da mr.and
    ipotizziamo che in risposta[i] dovrebbe trovarsi \r:
    In che senso "ipotizziamo" ... ?

    Hai fatto un po' di debugging o no?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di mr.and
    Registrato dal
    Dec 2008
    Messaggi
    51
    Si, ho implementato un client che apre la connessione sul server come ho mostrato e invia una stringa di prova terminata da \r\n.Il server riceve la stringa ma stampadno i caratteri della stringa ricevuta 1 per 1 è questo quello che ottengo: al posto di tali caratteri (che dovrebbero chiudere la stringa)stampa 3 caratteri fuori significato(tradotti in int mi da 108, -2 e -48),mentre è tutto regolare per gli altri caratteri.
    In pratica,facendo riferimento al codice precedentemente postato,se il client spedisce "CIAO\r\n", in risposta trovo una stringa tale che strlen(rispsosta)=7 dove ho:

    risposta[0]=C
    risposta[1]=I
    risposta[2]=A
    risposta[3]=O
    risposta[4]=l(valore corrispondente in int 108)
    risposta[5]=*(valore corrispondente in int -2)
    risposta[6]=*(valore corrispondente in int -48)

    (* indica un carattere che non so come riprodurre )

    risposta prima di venire passata alla recv viene dichiarata come segue:

    char* risposta[256];

    Perchè ha questo comportamento?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Non devi usare la sizeof ma

    send(clientsocket,messaggio,strlen(messaggio),0);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di mr.and
    Registrato dal
    Dec 2008
    Messaggi
    51
    Ok, grazie mille!! Adesso ricevo i giusti valori!!

    L'utilizzo di sizeof() è giusto nella recv ma non nella send! Infatti ho provato a sostituirlo anche nella recv ma con pessimi risultati.

    Però mi si è manifestato un altro problema.
    La mia recv è inclusa in un ciclo iterativo e non si blocca in attesa di un nuovo messaggio,e così mi viene analizzata in continuazione la stringa in cui dovrebbe essere memorizzato il nuovo messaggio.
    Aggiungo il codice usato per creare il socket...non mi sembra di aver specificato da nessuan parte che volevo un socket non bloccante!

    codice:
    WORD wVersionRequested = MAKEWORD(2,2);
    WSADATA wsaData;
    int wsastartup = WSAStartup(wVersionRequested, &wsaData);
    listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    Server_addr.sin_family = AF_INET; 
    Server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    Server_addr.sin_port = htons(port);
    if (bind(listenSocket,(LPSOCKADDR)&Server_addr,sin_size) < 0) 
    printf("Server: errore durante la bind.\n"); 
    ls_result = listen(listenSocket, 1);
    connessione = accept(listenSocket, (struct sockaddr *)&Client_addr, &sin_size);
    r=recv(connessione, risposta, sizeof(risposta), 0);

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ma

    risposta

    come e' dichiarato?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di mr.and
    Registrato dal
    Dec 2008
    Messaggi
    51
    char risposta[SIZE_BUF];

    dove SIZE_BUF=256

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ok ... e il ciclo di cui parlavi?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it L'avatar di mr.and
    Registrato dal
    Dec 2008
    Messaggi
    51
    codice:
    while(1){
    
    r=recv(connessione, risposta, sizeof(risposta), 0);
    
    myfunc(risposta);
    
    }

    In pratica il ciclo serve per far rimanere il server sempre in attesa di messaggi una volta finita l'elaborazione dell'ultimo messaggio ricevuto, ma al ciclo successivo invece di fermarsi su recv in attesa di un nuovo messaggio, ritorna 0 e passa a myfunc rielaborando così risposta infinite volte.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    La guida per la recv indica

    "If the connection has been gracefully closed, the return value is zero."

    Quindi, se r e' 0, devi controllarlo ed uscire dal ciclo perche' la connessione e' stata chiusa.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.