|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Oct 2001
Città: Trento
Messaggi: 164
|
[c/c++] Client-Server --> Peer-to-Peer
Ciao,
mi potete dire come trasformare questa semplice applicazione client/server in un applicazione peer-to-peer? L'intenzione è quella di ascoltare da una porta e ricevere dati (in questo caso stringhe di caratteri) da un'altra porta lanciando un' unica applicazione. Magari utilizzando un menù nel caso si voglia inviare dati. Thanks... // UDP server #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <stdio.h> #include <unistd.h> // close() #include <string> // memset() #include <iostream> using namespace std; #define LOCAL_SERVER_PORT 7000 #define MAX_MSG 100 int main(int argc, char *argv[]) { int sd, rc, n, cliLen; struct sockaddr_in cliAddr, servAddr; char msg[MAX_MSG]; // apertura della socket sd = socket(AF_INET, SOCK_DGRAM, 0); if (sd < 0) { printf("%s: errore nell'apertura della socket \n",argv[0]); exit(1); } // bind della porta 7000 servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = htonl(INADDR_ANY); servAddr.sin_port = htons(LOCAL_SERVER_PORT); rc = bind(sd, (struct sockaddr *)&servAddr, sizeof(servAddr)); if (rc < 0) { printf("%s: errore nella bind %d \n",argv[0],LOCAL_SERVER_PORT); exit(1); } // loop infinito per la gestionde delle connessioni while(1) { // inizializziamo il buffer per la ricezione memset(msg,0x0,MAX_MSG); // ricezione messaggi cliLen = sizeof(cliAddr); n = recvfrom(sd, msg, MAX_MSG, 0, (struct sockaddr *)&cliAddr,(socklen_t *)&cliLen); if (n < 0) { printf("%s: impossibile ricevere dati \n",argv[0]); continue; } // stampa il messaggio ricevuto printf("%s: dati da %s:UDP%u : %s \n", argv[0], inet_ntoa(cliAddr.sin_addr), ntohs(cliAddr.sin_port), msg); } return 0; } // UDP Client #include <sys/time.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <stdio.h> #include <unistd.h> // close() #include <string> // memset() #include <iostream> using namespace std; #define REMOTE_SERVER_PORT 7000 #define MAX_MSG 100 int main(int argc, char *argv[]) { int sd, rc, i; struct sockaddr_in cliAddr, remoteServAddr; struct hostent *h; // controllo paramentri inseriti via riga di comando if (argc < 3) { printf("usage: %s <server> <data1> ... <dataN> \n", argv[0]); exit(1); } // estrazione indirizzo IP dalla riga di comando h = gethostbyname(argv[1]); if (h == NULL) { printf("%s: host sconosciuto '%s' \n", argv[0],argv[1]); exit(1); } printf("%s: trasmissione dati a '%s' (IP : %s) \n", argv[0], h->h_name, inet_ntoa(*(struct in_addr *)h->h_addr_list[0])); // creazione struttura dati sockaddr_in relativa al server remoto remoteServAddr.sin_family = h->h_addrtype; memcpy((char *)&remoteServAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length); remoteServAddr.sin_port = htons(REMOTE_SERVER_PORT); // creazione socket e bind di una porta // creazione socket sd = socket(AF_INET, SOCK_DGRAM, 0); if (sd < 0) { printf("%s: impossibile aprire la socket \n",argv[0]); exit(1); } // bind su una porta qualsiasi cliAddr.sin_family = AF_INET; cliAddr.sin_addr.s_addr = htonl(INADDR_ANY); cliAddr.sin_port = htons(0); rc = bind(sd, (struct sockaddr *)&cliAddr, sizeof(cliAddr)); if (rc < 0) { printf("%s: impossibile aprire la porta %d \n",argv[0]); exit(1); } // invio dati e chiusura socket for(i=2;i<argc;i++) { rc = sendto(sd, argv[i], strlen(argv[i])+1, 0, (struct sockaddr *)&remoteServAddr, sizeof(remoteServAddr)); if (rc < 0) { printf("%s: trasmettere dati %d \n",argv[0], i-1); close(sd); exit(1); } } return 1; } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2000
Città: Vignola (MO)
Messaggi: 316
|
Mi interessa... vi seguo!
__________________
<Asus A8N-E Deluxe> <Amd64 3000+> <Ram 2.5 Gb> <Geffo3> <2 Maxtor 160 Gb RAID 1> <Adsl ZyXEL 645r> <ESS Maestro> <GNU/Linux Debian Etch> ![]() Wii 1037 4238 6261 1967 |
![]() |
![]() |
![]() |
#3 | |||
Senior Member
Iscritto dal: Oct 2004
Città: Acireale
Messaggi: 447
|
Quote:
![]() Ma poi cosa intendi per "trasformare" ? ![]() Quote:
Quote:
Oppure per sapere quanto costa "il coperto" + "il vino" ? Cerca di essere più chiaro. ![]()
__________________
Ho concluso acquisti e/o vendite con : SHIVA>>LuR<<, TheGaiden, ArvMau |
|||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:57.