Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Chiamata di sistema unix, recvfrom()
Forum - C/C++ - Chiamata di sistema unix, recvfrom()

Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 0:34
Mercoledì, 12/12/2012
Vorrei connettermi ad'un indirizzo IP e leggere un'intero senza segno(host byte order) in una porta nota.

Codice sorgente - presumibilmente C++

  1. [CODE]#include<stdlib.h>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<sys/types.h>
  5. #include<sys/socket.h>
  6. #include<netinet/in.h>
  7.  
  8. #define DEST_IP "141.138.199.118"
  9. #define DEST_PORT 5842
  10.  
  11. int main(void)
  12. {
  13.         int sockfd;
  14.         struct sockaddr_in my_addr;
  15.         struct sockaddr_in dest_addr;
  16.        
  17.         sockfd = socket(PF_INET, SOCK_DGRAM, 0);
  18.  
  19.         my_addr.sin_family = AF_INET;
  20.         my_addr.sin_port = 0;   // sceglie una porta a caso non in uso
  21.         my_addr.sin_addr.s_addr = INADDR_ANY; // usa il mio indirizzo IP
  22.         memset(my_addr.sin_zero, '\0', sizeof my_addr.sin_zero);
  23.        
  24.         dest_addr.sin_family = AF_INET;  // host byte order
  25.         dest_addr.sin_port = DEST_PORT;  // long, network byte order
  26.         dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);
  27.         memset(dest_addr.sin_zero, '\0', sizeof dest_addr.sin_zero);
  28.  
  29.         connect(sockfd, (struct sockaddr *)&dest_addr, sizeof dest_addr );
  30.        
  31.         unsigned int buffer[4];
  32.        
  33.         recvfrom( sockfd,  buffer, 4, 0,
  34.                        (struct sockaddr *)&my_addr,
  35.                        (int *) sizeof(struct sockaddr) ); //si ferma qua
  36.        
  37.         int register i;
  38.         for(i=0 ; i<4 ; i++)
  39.                 printf("%d° intero letto: %d",i , buffer[i]);
  40.         printf("\n");  
  41.  
  42.         return 0;
  43. }[/CODE]



Il mio programma non va più avanti dopo l'invocazione di recvfrom(), ho pensato che rimane in attesa poiché la porta a cui sono connesso non invia nulla, ma di ciò non sono molto convinto. Quindi la mia domanda è, la funzione resta in attesa perché non riceve niente? Se no, perché non va avanti?

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 2:49
Mercoledì, 12/12/2012
Testo quotato


If no messages are available at the socket and O_NONBLOCK is not set on the socket's file descriptor, recvfrom() blocks until a message arrives.



http://pubs.opengroup.org/onlinepubs/7908799/xns/recvfrom. ...

Resta in attesa perche' non stai ricevendo niente.


Il mio blog: https://piero.dev
PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 437
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 10:55
Mercoledì, 12/12/2012
Se non sono disponibili dati la funzione si blocca, a meno di non aver aperto il socket in modalità non bloccante, nel qual caso si avrà il solito errore di EAGAIN.

Fonte:http://users.lilik.it/~mirko/gapil/gapilsu266.html

Leggi tutto è scritto bene

Io ti consiglio di usare le funzioni read e write, una volta stabilita la connessione tra i due host, questi comunicano mediante un buffer

Ultima modifica effettuata da Bonny il 12/12/2012 alle 10:58
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6367
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:42
Mercoledì, 12/12/2012


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 20:33
Mercoledì, 12/12/2012
Si grazie Bonny, ero proprio perso in quel manuale, ho visto che eseguendo la connect() in modalità SOCK_DGRAM rendiamo possibile la comunicazione con read() e write(), ma dovrebbe funzionare anche con recvfrom() non connettendo.

La discussione http://forum.html.it/forum/showthread.php?s=&postid=137708 ... è mia!


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6367
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:19
Mercoledì, 12/12/2012
Sì ... lo so che è tua ... non ci voleva molto a capirlo ... :noway:

Ma proprio per questo te l'ho detto, perché lì ci sono le risposte.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 23:50
Mercoledì, 12/12/2012
Ah beh, si!

Ecco il codice funzionate, per la travagliata storia che l'ha reso tale vedi, dove dice *(nessuno):rotfl:.

Codice sorgente - presumibilmente C++

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<sys/types.h>
  4. #include<sys/socket.h>
  5. #include<netinet/in.h>
  6.  
  7. #define DEST_IP "141.138.199.118"
  8. #define DEST_PORT 5842
  9.  
  10. int main(void)
  11. {
  12.         int sockaf;
  13.         struct sockaddr_in my_addr;
  14.         struct sockaddr_in dest_addr;
  15.        
  16.        
  17.         sockaf = socket(AF_INET,SOCK_STREAM,0);
  18.         if( sockaf < 0 )
  19.         {
  20.                 perror("Address creation error");
  21.         return -1;
  22.         }
  23.  
  24.         my_addr.sin_family = AF_INET;
  25.         my_addr.sin_port = 0;   // sceglie una porta a caso non in uso
  26.         my_addr.sin_addr.s_addr = INADDR_ANY; // usa il mio indirizzo IP
  27.         memset(my_addr.sin_zero, '\0', sizeof my_addr.sin_zero);
  28.        
  29.         dest_addr.sin_family = AF_INET;  // host byte order
  30.         dest_addr.sin_port = htons(DEST_PORT);
  31.         dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);
  32.         memset(dest_addr.sin_zero, '\0', sizeof dest_addr.sin_zero);
  33.        
  34.        
  35.         if( connect(sockaf, (struct sockaddr *)&dest_addr, sizeof dest_addr )  < 0 )
  36.         {
  37.                 perror("Errore durante la connessione: ");
  38.                 return -1;
  39.         }
  40.        
  41.         unsigned char recvbuff[4];
  42.         int dest_addr_size = sizeof (dest_addr);
  43.  
  44.         if( read(sockaf, recvbuff, 4)  < 0 )
  45.         {
  46.                 perror("Errore in ricezzione: ");
  47.         return -1;
  48.         }
  49.  
  50.         register int i;
  51.         for( i=0 ; i<4 ; i++ )
  52.                 printf( "-%X-", recvbuff[i] );
  53.         printf( "\n" );
  54.  
  55.         return 0;
  56. }


Ultima modifica effettuata da Dante.cpp il 12/12/2012 alle 23:52
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6367
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:51
Giovedì, 13/12/2012
Questa linea

int dest_addr_size = sizeof (dest_addr);

non ti serve più se usi la read.

Ti era stata consigliata nel caso della recvfrom


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 13:48
Giovedì, 13/12/2012
Giustissimo, tra una modifica e l'altra!

Ultima modifica effettuata da Dante.cpp il 13/12/2012 alle 13:49
PM Quote