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.