Lab.5. Komunikacja z wykorzystaniem IP/UDP W procesie
Transkrypt
Lab.5. Komunikacja z wykorzystaniem IP/UDP W procesie
Lab.5. Komunikacja z wykorzystaniem IP/UDP W procesie kompilacji obydwu poniszych programów konieczne jest dodanie biblioteki „gniazd” (ang. socket) umoliwiajcych wykorzystanie protokołu IP/UDP do komunikacji. cc -o nazwa nazwa.c /lib/libsocket.so /* server.c */ #include <stdio.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> int s; char bufor[32768]; int main(int argc, char *argv[]) { struct sockaddr_in local; struct sockaddr_in from; s=socket( AF_INET , SOCK_DGRAM , 17 ); if(s<0) { printf("socket() failed.\n"); return 0; } local.sin_family = AF_INET; local.sin_port = htons ( 1234 ); local.sin_addr.s_addr = INADDR_ANY; if(bind(s, (struct sockaddr *) &local, sizeof ( local ) ) == -1 ) { printf ( "bind() failed.\n" ); return 0; } listen(s,10); from.sin_family=AF_INET; from.sin_addr.s_addr=INADDR_ANY; while(1) { int licz,flen; flen=sizeof(from); licz=recvfrom( s , bufor , sizeof(bufor) , 0 , (struct sockaddr *) &from , &flen ); if(licz>0) { flen=sizeof(from); sendto( s , bufor , licz , 0 , (struct sockaddr *) &from , flen); } } return 0; } Zadaniem programu serwera jest odsyłanie wszelkich danych jakie transmituje do niego program klienta, czyli pełni on rol serwera „echo”. /* client.c */ #include <stdio.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> int connectUDP(char *host , u_short service) { struct sockaddr_in sin; int s; sin.sin_family=AF_INET; sin.sin_port=htons(service); sin.sin_addr.s_addr=inet_addr(host); s=socket(PF_INET,SOCK_DGRAM,17); if(s<0) { printf(" can't create socket\n"); return 0; } if(connect(s,(struct sockaddr*) &sin, sizeof(sin))<0) { printf(" can't connect \n"); return 0; } return s; } char buf[32768]; int main(int argc,char *argv[]) { int s; if(argc<2) { printf("\r\nUsage: client IP\r\n"); return 1; } s=connectUDP(argv[1],1234); if(s==0) { return 1;} if(send(s,buf,100,0)==-1) { printf("socket error\r\n"); return 1; } if(recv(s,buf,sizeof(buf),0)==-1) { printf("socket read failed\n"); return 1; } return 0; } Program klienta naley tak zmodyfikowa, aby zmierzy prdko transmisji przy rónych długociach przesyłanych danych (10,100,1000,10000). Z uwagi na ograniczenia polecenia time, transmisj naley powtarza wielokrotnie, tak aby czas trwania pojedynczego wykonania programu klienta był wikszy od 10 sekund.