iao a tutti,
Sto facendo delle esercitazioni sulla programmazione socket, ma non ci sto capendo granchè. Sono partito da questi due semplici Programmi, un client ed un server. Il client ed il server girano sulla stessa macchina, e comunicano sull'indirizzo localhost. fin qui funziona.
L'esercitazione ora prevede di sviluppare uno pseudo NAT. in altre parole il client manda un messaggio al server il quale appena lo riceve, lo prende e gli cambia l'indirizzo. Posso assegnare al client ed al server un indirizzo qualsiasi posto di 127.0.0.1?..o devo sottostare a delle regole ben precise?
Ho provato con il codice qua sotto, ma non riesco neache a provare la comnicazione poichè quando lancio il programma server mi mi ritorna un errore con la dicitura "bind: Cannot assign requested address". Potete aiutarmi a capire dove sbaglio? Per la precisione la macchina su cui sto provando è una macchina guest di virtualbox.
SERVER:
codice:int main(int argc, char *argv[]){ struct sockaddr_in peer; struct hostent *server; int s, i; char buf[1500]; if (argc < 4) { fprintf (stderr, "Usage: %s peer port n_packets", argv[0]); exit (1); } server=gethostbyname(argv[1]); if (server == NULL) { fprintf(stderr,"ERROR, no such host\n"); exit(1); } if ((s=socket(AF_INET, SOCK_DGRAM, 0))==-1){ perror("Socket"); exit(1); } bzero((char *) &peer, sizeof(peer)); peer.sin_family=AF_INET; bcopy((char *)server->h_addr, (char *)&peer.sin_addr.s_addr, server->h_length); peer.sin_addr.s_addr=inet_addr("10.10.10.2"); peer.sin_port= htons(atoi(argv[2])); for (i=0; i<atoi(argv[3]); i++) { printf("Sending packet %d\n", i); sprintf(buf, "This is packet %d\n", i); printf("Send packet from %s:%d\nData: %s\n\n", inet_ntoa(peer.sin_addr), ntohs(peer.sin_port), buf); if (sendto(s, buf, sizeof(buf), 0, (struct sockaddr *) &peer, sizeof(peer))==-1) { perror("sendto()"); exit(1); } } }codice:Client # include <strings.h> # include <stdlib.h> # include <netinet/in.h> # include <stdio.h> # include <sys/types.h> # include <sys/socket.h> int main(int argc, char *argv[]){ struct sockaddr_in myself, peer; int peer_len = sizeof(peer); int b_len; int s, i; char buf[1500]; if (argc < 2) { fprintf (stderr, "Usage: %s port_number\n", argv[0]); exit(1); } if ((s=socket(AF_INET, SOCK_DGRAM, 0))==-1) { perror("socket"); exit (1); } bzero((char *) &myself, sizeof(myself)); myself.sin_family=AF_INET; //myself.sin_addr.s_addr=INADDR_ANY; myself.sin_addr.s_addr=inet_addr("10.10.10.10"); myself.sin_port= htons(atoi(argv[1])); if (bind(s, (struct sockaddr *) &myself, sizeof(myself))==-1) { perror("bind"); exit(1); } while(1){ if (recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr *) &peer, &peer_len)==-1){ perror("recvfrom()"); exit(1); } printf("Received packet from %s:%d\nData: %s\n\n", inet_ntoa(peer.sin_addr), ntohs(peer.sin_port), buf); } }

Rispondi quotando