#include #include #include #include #include #include #include #include #include #include #define MSIZE 1500 //lungimea maxima a mesajului #define PORTFORWARD 12345 //portul la care asculta #define PORTSERVER 9099 #define ADDR_SERVER "172.30.0.5" #define MAXCLIENTS 10 char buffer[MAXCLIENTS][5*MSIZE]; int n; struct sockaddr_in clients[MAXCLIENTS]; int sock; struct sockaddr_in addr_server; int client_exists(struct sockaddr_in s) { // acest cod nu e bun - trebuie modificat !!!! // aceasta functie trebuie sa intoarca indexul clientului // identificat de s in vectorul clients return n; } void handleClient(void *arg) { int clientno, i, j, k, sock_client, len_addr; char msg[MSIZE]; clientno = *((int*) arg); sock_client = socket(AF_INET,SOCK_DGRAM,0); if (sock_client == -1) { perror("err la creare socket socketd in handleClient:"); exit(1); } // nu este obligatoriu sa facem bind (?) len_addr = sizeof(addr_server); while (1) { i = recvfrom(sock_client, msg, MSIZE, MSG_DONTWAIT, &addr_server, &len_addr); if (i==-1 && errno!=EAGAIN) { perror("err receiving in client:"); } if (i>0) { j = sendto(sock, msg, i, 0, &clients[clientno], len_addr); } //acest cod trebuie modificat ... trebuie verificat daca //sunt date in bufferul client si numai daca sunt sa se trimita //pe socketul sock_client... sleep(2); i = sendto(sock_client, buffer[clientno], strlen(buffer[clientno])+1, 0, &addr_server, len_addr); //printf("am trimis %d bytes (%s) din clientul %d la portul %d, adresa %x\n", i, buffer[clientno], clientno, ntohs(addr_server.sin_port), ntohl(addr_server.sin_addr.s_addr)); } } main() { int i,c,len_addr; char msg[MSIZE]; struct sockaddr_in addr,addr_client; struct hostent *hent; pthread_t thid; sock = socket(AF_INET,SOCK_DGRAM,0); if (sock == -1) { perror("err la creare socket:"); exit(1); } //curat continutul lui sock (scriu 0) memset((char *)&addr,0,sizeof(addr)); addr.sin_family=AF_INET; //domeniul Internet addr.sin_addr.s_addr=htonl(INADDR_ANY); //adresa IP la care asculta serverul (INADDR_ANY=oricare) addr.sin_port=htons(PORTFORWARD); //portul server if( bind(sock,(struct sockaddr *) &addr,sizeof(addr)) <0) { perror("Eroare la bind PORTFORWARD:"); exit(1); } // setam sockaddr_in pentru server memset((char *)&addr_server,0,sizeof(addr_server)); addr_server.sin_family=AF_INET; addr_server.sin_addr.s_addr=inet_addr(ADDR_SERVER); addr_server.sin_port=htons(PORTSERVER); // la inceput nu avem clienti n = -1; while(1) { len_addr=sizeof(struct sockaddr); i = recvfrom(sock, msg, MSIZE, 0, &addr_client, &len_addr); //printf("received %d bytes from client\n", i); if (i>0) { if ((c = client_exists(addr_client)) == -1) { n++; clients[n] = addr_client; pthread_create(&thid, NULL, handleClient, (void*) &n); c = n; sleep(1); } // aici trebuie modificat .... de sincronizat accesul la buffer memcpy(buffer[c], msg, i); buffer[c][i]=0; } } }