PDA

View Full Version : [c/c++] Client-Server --> Peer-to-Peer


Rigo007
17-08-2005, 13:39
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;
}

Passy
18-08-2005, 14:43
Mi interessa... vi seguo!

Blackat
19-08-2005, 08:55
mi potete dire come trasformare questa semplice applicazione client/server in un applicazione peer-to-peer?


Ma che c'entra il P2P ? :confused:
Ma poi cosa intendi per "trasformare" ? :mbe:

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.


Basta che apri due porte....una dove ascolti e una dove ricevi.

Magari utilizzando un menų nel caso si voglia inviare dati.


Ma il menų serve a sapere quanto costa l'invio di dati ?
Oppure per sapere quanto costa "il coperto" + "il vino" ?

Cerca di essere pių chiaro. :Prrr: