Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
Vorrei connettermi ad'un indirizzo IP e leggere un'intero senza segno(host byte order) in una porta nota.
Codice sorgente - presumibilmente C++ |
[CODE]#include<stdlib.h> #include<stdio.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #define DEST_IP "141.138.199.118" #define DEST_PORT 5842 int main(void) { int sockfd; struct sockaddr_in my_addr; struct sockaddr_in dest_addr; sockfd = socket(PF_INET, SOCK_DGRAM, 0); my_addr.sin_family = AF_INET; my_addr.sin_port = 0; // sceglie una porta a caso non in uso my_addr.sin_addr.s_addr = INADDR_ANY; // usa il mio indirizzo IP memset(my_addr.sin_zero, '\0', sizeof my_addr.sin_zero); dest_addr.sin_family = AF_INET; // host byte order dest_addr.sin_port = DEST_PORT; // long, network byte order dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); memset(dest_addr.sin_zero, '\0', sizeof dest_addr.sin_zero); connect(sockfd, (struct sockaddr *)&dest_addr, sizeof dest_addr ); unsigned int buffer[4]; recvfrom( sockfd, buffer, 4, 0, (struct sockaddr *)&my_addr, (int *) sizeof(struct sockaddr) ); //si ferma qua int register i; for(i=0 ; i<4 ; i++) printf("%d° intero letto: %d",i , buffer[i]); printf("\n"); return 0; }[/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?
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
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.
|
|
|
Bonny (Member)
Expert
Messaggi: 437
Iscritto: 24/04/2009
|
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 |
|
nessuno (Normal User)
Guru^2
Messaggi: 6367
Iscritto: 03/01/2010
|
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à. |
|
Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
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!
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6367
Iscritto: 03/01/2010
|
Sì ... lo so che è tua ... non ci voleva molto a capirlo ...
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à. |
|
Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
Ah beh, si!
Ecco il codice funzionate, per la travagliata storia che l'ha reso tale vedi, dove dice *(nessuno).
Codice sorgente - presumibilmente C++ |
#include<stdio.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #define DEST_IP "141.138.199.118" #define DEST_PORT 5842 int main(void) { int sockaf; struct sockaddr_in my_addr; struct sockaddr_in dest_addr; sockaf = socket(AF_INET,SOCK_STREAM,0); if( sockaf < 0 ) { perror("Address creation error"); return -1; } my_addr.sin_family = AF_INET; my_addr.sin_port = 0; // sceglie una porta a caso non in uso my_addr.sin_addr.s_addr = INADDR_ANY; // usa il mio indirizzo IP memset(my_addr.sin_zero, '\0', sizeof my_addr.sin_zero); dest_addr.sin_family = AF_INET; // host byte order dest_addr.sin_port = htons(DEST_PORT); dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); memset(dest_addr.sin_zero, '\0', sizeof dest_addr.sin_zero); if( connect(sockaf, (struct sockaddr *)&dest_addr, sizeof dest_addr ) < 0 ) { perror("Errore durante la connessione: "); return -1; } unsigned char recvbuff[4]; int dest_addr_size = sizeof (dest_addr); if( read(sockaf, recvbuff, 4) < 0 ) { perror("Errore in ricezzione: "); return -1; } register int i; for( i=0 ; i<4 ; i++ ) printf( "-%X-", recvbuff[i] ); printf( "\n" ); return 0; }
|
Ultima modifica effettuata da Dante.cpp il 12/12/2012 alle 23:52 |
|
nessuno (Normal User)
Guru^2
Messaggi: 6367
Iscritto: 03/01/2010
|
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à. |
|
Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
Giustissimo, tra una modifica e l'altra!
Ultima modifica effettuata da Dante.cpp il 13/12/2012 alle 13:49 |
|