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;
}
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;
}