You are on page 1of 31

EX.

NO:1 Tcp date and time: Client program:

TCP SOCKET PROGRAMMING

#include<stdio.h> #include<string.h> #include<stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include<netdb.h> int main() { int sd,c; char msg[50],sip[15]; struct sockaddr_in caddr; struct hostent *he; printf("Enter the ip address: "); scanf("%s", sip); he= gethostbyname(sip); sd = socket(AF_INET,SOCK_STREAM,0); if(sd!=-1) { printf("Socket is created"); } else { printf("socket is not created"); } caddr.sin_family = AF_INET; caddr.sin_addr = *((struct in_addr*)he->h_addr); caddr.sin_port = htons(1200); c= connect(sd, (struct sockaddr*)&caddr,sizeof(caddr)); if(c==0) printf("connected to server"); else printf("not connected"); recv(sd,msg,sizeof(msg),0); printf(" The day and time : %s",msg); close(sd); return 0; }

Server program: #include<stdio.h> #include<string.h> #include<stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include<netdb.h> int main() { int sd,b,cd; char msg[100]; struct sockaddr_in caddr,saddr; socklen_t clen=sizeof(caddr); time_t tick; sd=socket(AF_INET,SOCK_STREAM,0); if(sd!=-1) printf("\nsocket is created"); else printf("\nsocket is not created"); saddr.sin_addr.s_addr=htons(INADDR_ANY); saddr.sin_port=htons(1200); b=bind(sd,(struct sockaddr*)&saddr,sizeof(saddr)); if(b==0) printf("\nbinded to client"); else printf("\nnot binded"); listen(sd,5); while(1); { cd=accept(sd,(struct sockaddr*)&caddr,&clen); tick=time(NULL); printf("Sys day & time: %s",ctime(&tick)); strcpy(msg,(char*)ctime(&tick)); send(cd,msg,sizeof(msg),0); } close(sd); close(cd); return 0; }

Output \* To get output from server the server code have to be executed first.*\ TCP SERVER [sys45@localhost ~]$ cc tcpserver.c [sys45@localhost ~]$ ./a.out tcpserver ******************************************************** socket is created binded to client Sys day & time: Mon Sep 6 15:41:50 2010 ******************************************************** TCP CLIENT [sys45@localhost ~]$ cc tcpclient.c [sys45@localhost ~]$ ./a.out tcpclient.c ******************************************************** Enter the ip address: 192.168.1.104 Socket is created connected to server The day and time : Mon Sep 6 15:45:58 2010 ********************************************************

Ex.no:2 ECHO CLIENT

TCP ECHO PROGRAM

#include<stdio.h> #include<netinet/in.h> #include<sys/types.h> #include<sys/socket.h> #include<netdb.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #include<arpa/inet.h> #include<errno.h> #include<time.h> #define MAX 80 #define PORT 43454 #define SA struct sockaddr void func(int sockfd) { char buff[MAX]; int n; for(;;) { bzero(buff,sizeof(buff)); printf("enter the string:"); n=0; while((buff[ n++ ]=getchar())!='\n'); write(sockfd,buff,sizeof(buff)); bzero(buff,sizeof(buff)); read(sockfd,buff,sizeof(buff)); printf("from server: %s", buff); if ((strncmp(buff,"exit",4)) == 0) { printf("client exit...\n"); break; } } } int main() { int sockfd,connfd; struct sockaddr_in servaddr,cli; sockfd = socket(AF_INET,SOCK_STREAM,0); if(sockfd==-1) { printf("socket creation failed...\n");

exit(0); } else printf("socket successfully created" ); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_addr.s_addr=inet_addr("127.0.0.1"); servaddr.sin_port=htons(PORT); if(connect(sockfd,(SA*)&servaddr,sizeof(servaddr))!=0) { printf("connection with the server failed...\n"); exit(0); } else printf("connected to the server... \n"); func(sockfd); close(sockfd); } ECHO SERVER #include<stdio.h> #include<netinet/in.h> #include<sys/types.h> #include<sys/socket.h> #include<netdb.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #include<arpa/inet.h> #include<errno.h> #include<time.h> #define MAX 80 #define PORT 43454 #define SA struct sockaddr void func(int sockfd) { char buff[MAX]; for(;;) { bzero(buff,MAX); read(sockfd,buff,sizeof(buff)); printf("from client: %s\n",buff); write(sockfd,buff,sizeof(buff)); if(strncmp("exit",buff,4)==0) {

printf("server exit...\n"); break; } } } int main() { int sockfd,connfd,len; struct sockaddr_in servaddr,cli; sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd==-1) { printf("socket creation failed...\n"); exit(0); } else printf("socket successfully created...\n"); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_addr.s_addr=htonl(INADDR_ANY); servaddr.sin_port=htons(PORT); if((bind(sockfd,(SA*)&servaddr,sizeof(servaddr)))!=0) { printf("socket bind failed...\n"); exit(0); } else printf("socket successfully binded...\n"); if((listen(sockfd,5))!=0) { printf("listen failed...\n"); exit(0); } else printf("server listening...\n"); len=sizeof(cli); connfd=accept(sockfd,(SA*)&cli,&len); if(connfd<0) { printf("server accept failed...\n"); exit(0); } else printf("server accept the client...\n"); func(connfd); close(sockfd);

} OUTPUT EXPLORER1: [sys45@localhost ~]$ cc echoserver.c [sys45@localhost ~]$ ./a.out echoserver.c socket successfully createdsocket successfully binded.... server listening... server accept the client... from client:this from client:is from client:computer from client:networks [2]+ Stopped ./a.out echoserver.c EXPLORER2: [sys45@localhost ~]$ cc echoclient.c [sys45@localhost ~]$ ./a.out echoclient socket successfully createdconnected to the server... enter the string:this from server: this enter the string:is from server: is enter the string:computer from server: computer enter the string:networks from server: networks enter the string:Q [2]+ Stopped ./a.out echoclient

Ex.no:3 UDPSERVER.C

UDP socket programming

#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <stdlib.h> int main() { int sock; int addr_len, bytes_read; char recv_data[1024]; struct sockaddr_in server_addr , client_addr; if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("Socket"); exit(1); } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(5000); server_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(server_addr.sin_zero),8); if (bind(sock,(struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { perror("Bind"); exit(1); } addr_len = sizeof(struct sockaddr); printf("\nUDPServer Waiting for client on port 5000"); fflush(stdout); while (1) { bytes_read = recvfrom(sock,recv_data,1024,0, (struct sockaddr *)&client_addr, &addr_len); recv_data[bytes_read] = '\0'; printf("\n(%s , %d) said : ",inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); printf("%s", recv_data); fflush(stdout); }

return 0; }

UDPCLIENT.C #include<sys/types.h> #include<netdb.h> #include<sys/socket.h> #include<netinet/in.h> #include<stdio.h> #include<string.h> #include<arpa/inet.h> int main(int argc,char* argv[]) { int sockfd,n; socklen_t len; char msg[1024],buf[1024]; struct sockaddr_in servaddr,cliaddr; struct hostent *hp; sockfd=socket(AF_INET,SOCK_DGRAM,0); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_addr.s_addr=htonl(INADDR_ANY); servaddr.sin_port=htons(5555); bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); for(;;) { len=sizeof(cliaddr); n=recvfrom(sockfd,msg,100,0,(struct sockaddr*)&cliaddr,&len); msg[n]='\0'; printf("%s\n",msg); if(n<0) { perror("send error"); } if((hp=gethostbyname(msg))==NULL) { printf("Cant get addr\n"); } if((inet_ntop(AF_INET,hp->h_addr_list[0],buf,sizeof(buf)))<=0) { printf("host addr not available"); } printf("%s",buf);

sendto(sockfd,buf,sizeof(buf),0, (struct sockaddr *)&cliaddr,len); } }

OUTPUT FROM CLIENT SIDE

[anandh@sambatecnetserver udpdns]$ ./cli 127.0.0.1 Enter the Domain name:www.google.com The IP ADDR of the Domain Server is 64.233.181.104 [anandh@sambatecnetserver udpdns]$ server output: [anandh@sambatecnetserver udpdns]$ ./ser www.google.com

Ex.no:4

udp dns program

program #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<stdio.h> #include<string.h> #include<arpa/inet.h> #define MAXLINE 1024 int main(int argc,char *argv[]) { int sockfd,n; socklen_t len; char sendline[1024],recvline[1024]; struct sockaddr_in servaddr; printf("Enter the Domain name:"); scanf("%s",sendline); sockfd=socket(AF_INET,SOCK_DGRAM,0); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_port=htons(5555); inet_pton(AF_INET,argv[1],&servaddr.sin_addr); len=sizeof(servaddr); sendto(sockfd,sendline,strlen(sendline),0, (struct sockaddr *)&servaddr,len); n=recvfrom(sockfd,recvline,MAXLINE,0,NULL,NULL); recvline[n]='\0'; printf("The IP ADDR of the Domain Server is %s\n",recvline); return 0; }

Server: #include<sys/types.h> #include<netdb.h> #include<sys/socket.h> #include<netinet/in.h> #include<stdio.h> #include<string.h> #include<arpa/inet.h> int main(int argc,char* argv[]) { int sockfd,n; socklen_t len; char msg[1024],buf[1024]; struct sockaddr_in servaddr,cliaddr; struct hostent *hp; sockfd=socket(AF_INET,SOCK_DGRAM,0); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_addr.s_addr=htonl(INADDR_ANY); servaddr.sin_port=htons(5555); bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); for(;;) { len=sizeof(cliaddr); n=recvfrom(sockfd,msg,100,0,(struct sockaddr*)&cliaddr,&len); msg[n]='\0'; printf("%s\n",msg); if(n<0) { perror("send error"); } if((hp=gethostbyname(msg))==NULL) { printf("Cant get addr\n"); } if((inet_ntop(AF_INET,hp->h_addr_list[0],buf,sizeof(buf)))<=0) { printf("host addr not available"); } printf("%s",buf); sendto(sockfd,buf,sizeof(buf),0, (struct sockaddr *)&cliaddr,len); } }

Ex.no:5

SLIDING WINDOW

STOP AND WAIT PROGRAM: #include<stdio.h> #include<stdlib.h> struct frame { int seq,data; }frm[10]; int e_f=1; int sender(); int recv(); int main() { sender(); } int sender() { int n,replay,i; printf("\n prepare the ticket to be sent"); printf("\n enter packets to be sent"); scanf("%d",&n); for(i=0;i<n;i++) { printf("\n enter the data for the packet[%d]",i); scanf("%d",&frm[i].data); frm[i].seq=(i+1)%2; } for(i=0;i<n;i++) { replay=recv(frm[i]); if(!replay) i=i-1; } return 0; } int recv(struct frame f) { int count=0,ack=0,option=0; char kc; if(f.seq==e_f) { while(option==0) { printf("\nack timer %d sec",++count);

sleep(2); printf("\n enter y \n"); kc=getchar(); if(kc=='y') { option=0; ack=1; break; } if(count==5) { ack=0; option=0; break; } } if(ack==1) { e_f=(e_f+1)%2; printf("\n acknowledged"); printf("\n recieved data is %d \n",f.data); return 1; } else { printf("\n time expired"); printf("\n data has to be resent"); } } return 0; }

output-stop and wait [student08@localhost 08]$ gcc stop.c [student08@localhost 08]$ ./a.out prepare the ticket to be sent enter packets to be sent3 enter the data for the packet[0]3 enter the data for the packet[1]4 enter the data for the packet[2]2 ack timer 1 sec enter y ack timer 2 sec enter y y acknowledged relceived data is 3 ack timer 1 sec enter y y ack timer 2 sec enter y acknowledged received data is 4 ack timer 1 sec enter y y ack timer 2 sec enter y acknowledged received data is 2

Ex.no:6

SLIDING WINDOW

#include<stdio.h> #include<stdlib.h> #include<math.h> int n,r; struct frame { char ack; int data; }frm[10]; int sender(void); void recvfrm(void); void resend(void); void resend1(void); void goback(void); void selective(void); int main() { int c; do { printf("\n 1.selective repeat arq\n 2.go back arq \n 3.exit"); printf("\n enter choice"); scanf("%d",&c); switch(c) { case 1: selective(); break; case 2: goback(); break; case 3: exit(0); break; } } while(c!=4); } void goback() { sender(); recvfrm(); resend1(); printf("\n all packets sent");

} void selective() { sender(); recvfrm(); resend(); printf("\n all packets are sent"); } int sender() { int i; printf("\n enter the number of packets to be sent"); scanf("%d",&n); for(i=0;i<n;i++) { printf("\n enter data fr packet[%d]",i); scanf("%d",&frm[i].data); frm[i].ack='y'; } return 0; } void recvfrm() { int i; rand(); r=rand()%n; frm[r].ack='n'; for(i=0;i<n;i++) { if (frm[i].ack=='n') { printf("\n packet no %d is not recieved",r); } } } void resend() { printf("\n resending packet %d",r); sleep(2); frm[r].ack='y'; printf("\n recieved packet is %d",frm[r].data); } void resend1() { int i; printf("\n resending packet from %d ",r);

for(i=r;i<n;i++) { sleep(2); frm[i].ack='y'; printf("\n recieved data of packet %d is %d",i,frm[i].data); } } output-sliding window [student08@localhost 08]$ gcc sliding.c [student08@localhost 08]$ ./a.out 1.selective repeat arq 2.go back arq 3.exit enter choice1 enter the number of packets to be sent2 enter data fr packet[0]3 enter data fr packet[1]4 packet no 0 is not received resending packet 0 received packet is 3 all packets are sent 1.selective repeat arq 2.go back arq 3.exit enter choice2 enter the number of packets to be sent3 enter data fr packet[0]1 enter data fr packet[1]2 enter data fr packet[2]3 packet no 1 is not received resending packet from 1 received data of packet 1 is 2 received data of packet 2 is 3 all packets sent 1.selective repeat arq 2.go back arq 3.exit enter choice3

Ex. No:7

REMOTE PROCEDURE CALL

PROGRAM (SIMP.H HEADER FILE) #ifndef _SIMP_H_RPCGEN #define _SIMP_H_RPCGEN #include <rpc/rpc.h> #ifdef __cplusplus extern "C" { #endif #define foo 127 struct operands { int x; int y; }; typedef struct operands operands; #define SIMP_PROG 555555555 #define SIMP_VERSION 1 #if defined(__STDC__) || defined(__cplusplus) #define ADD 1 extern int * add_1(operands *, CLIENT *); extern int * add_1_svc(operands *, struct svc_req *); #define SUB 2 extern int * sub_1(operands *, CLIENT *); extern int * sub_1_svc(operands *, struct svc_req *); extern int simp_prog_1_freeresult (SVCXPRT *, xdrproc_t, caddr_t); #else #define ADD 1 extern int * add_1(); extern int * add_1_svc(); #define SUB 2 extern int * sub_1(); extern int * sub_1_svc(); extern int simp_prog_1_freeresult (); #endif #if defined(__STDC__) || defined(__cplusplus) extern bool_t xdr_operands (XDR *, operands*); #else extern bool_t xdr_operands (); #endif #ifdef __cplusplus } #endif #endif

SIMP.X #define VERSION_NUMBER 1 #define foo 127 struct operands { int x; int y; }; program SIMP_PROG { version SIMP_VERSION { int ADD(operands) = 1; int SUB(operands) = 2; } = VERSION_NUMBER; } = 555555555;

SIMPCLT.C #include <memory.h> #include "simp.h" #define foo 127 static struct timeval TIMEOUT = { 25, 0 }; int * add_1(operands *argp, CLIENT *clnt) { static int clnt_res; memset((char *)&clnt_res, 0, sizeof(clnt_res)); if (clnt_call (clnt, ADD, (xdrproc_t) xdr_operands, (caddr_t) argp, (xdrproc_t) xdr_int, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } int * sub_1(operands *argp, CLIENT *clnt) { static int clnt_res; memset((char *)&clnt_res, 0, sizeof(clnt_res)); if (clnt_call (clnt, SUB,(xdrproc_t) xdr_operands, (caddr_t) argp,(xdrproc_t) xdr_int, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res);

SIMPSVC.C #include "simp.h" #include <stdio.h> #include <stdlib.h> #include <rpc/pmap_clnt.h> #include <string.h> #include <memory.h> #include <sys/socket.h> #include <netinet/in.h> #ifndef SIG_PF #define SIG_PF void(*)(int) #endif #define foo 127 static void simp_prog_1(struct svc_req *rqstp, register SVCXPRT *transp) { union { operands add_1_arg; operands sub_1_arg; } argument; char *result; xdrproc_t _xdr_argument, _xdr_result; char *(*local)(char *, struct svc_req *); switch (rqstp->rq_proc) { case NULLPROC: (void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL); return; case ADD: _xdr_argument = (xdrproc_t) xdr_operands; _xdr_result = (xdrproc_t) xdr_int; local = (char *(*)(char *, struct svc_req *)) add_1_svc; break; case SUB: _xdr_argument = (xdrproc_t) xdr_operands; _xdr_result = (xdrproc_t) xdr_int; local = (char *(*)(char *, struct svc_req *)) sub_1_svc; break; default: svcerr_noproc (transp);

return; }memset ((char *)&argument, 0, sizeof (argument)); if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) { svcerr_decode (transp); return; }result = (*local)((char *)&argument, rqstp); if (result != NULL && !svc_sendreply(transp, (xdrproc_t) _xdr_result, result)) { svcerr_systemerr (transp); }if (!svc_freeargs (transp,(xdrproc_t)xdr_argument,caddr_t) &argument)) { fprintf (stderr, "%s", "unable to free arguments"); exit (1); }return; }int main (int argc, char **argv) { register SVCXPRT *transp; pmap_unset (SIMP_PROG, SIMP_VERSION); transp = svcudp_create(RPC_ANYSOCK); if (transp == NULL) { fprintf (stderr, "%s", "cannot create udp service."); exit(1); }if (!svc_register(transp, SIMP_PROG, SIMP_VERSION, simp_prog_1, IPPROTO_UDP)) { fprintf (stderr, "%s", "unable to register (SIMP_PROG, SIMP_VERSION, udp)."); exit(1); }transp = svctcp_create(RPC_ANYSOCK, 0, 0); if (transp == NULL) { fprintf (stderr, "%s", "cannot create tcp service."); exit(1); } if (!svc_register(transp, SIMP_PROG, SIMP_VERSION, simp_prog_1, IPPROTO_TCP)) { fprintf (stderr, "%s", "unable to register (SIMP_PROG, SIMP_VERSION, tcp)."); exit(1); } svc_run (); fprintf (stderr, "%s", "svc_run returned"); exit (1); } SIMPXDR.C #include "simp.h" #define foo 127 bool_t xdr_operands (XDR *xdrs, operands *objp) { register int32_t *buf;

if (!xdr_int (xdrs, &objp->x)) return FALSE; if (!xdr_int (xdrs, &objp->y)) return FALSE; return TRUE; }

SIMPCLIENT.C #include <stdio.h> #include <stdlib.h> #include "simp.h" int add( CLIENT *clnt, int x, int y) { operands ops; int *result; OPS.x = x; ops.y = y; result = add_1(&ops,clnt); if (result==NULL) { fprintf(stderr,"Trouble calling remote procedure\n"); exit(0); } return(*result); } int sub( CLIENT *clnt, int x, int y) { operands ops; int *result; ops.x = x; ops.y = y; result = sub_1(&ops,clnt); if (result==NULL) { fprintf(stderr,"Trouble calling remote procedure\n"); exit(0); } return(*result); } int main( int argc, char *argv[]) { CLIENT *clnt; int x,y; if (argc!=4) { fprintf(stderr,"Usage: %s hostname num1 num\n",argv[0]);

exit(0); } clnt = clnt_create(argv[1], SIMP_PROG, SIMP_VERSION, "udp"); if (clnt == (CLIENT *) NULL) { clnt_pcreateerror(argv[1]); exit(1); } x = atoi(argv[2]); y = atoi(argv[3]); Printf("%d + %d = %d\n",x,y, add(clnt,x,y)); printf("%d - %d = %d\n",x,y, sub(clnt,x,y)); return(0); }

SIMPSERVICE.C #include <stdio.h> #include "simp.h" int * add_1_svc(operands *argp, struct svc_req *rqstp) { static int result; printf("Got request: adding %d, %d\n", argp->x, argp->y); result = argp->x + argp->y; return (&result); } int * sub_1_svc(operands *argp, struct svc_req *rqstp) { static int result; printf("Got request: subtracting %d, %d\n", argp->x, argp->y); result = argp->x - argp->y; return (&result); } RpcClient.c #include <stdio.h> #include <stdlib.h> #include "simp.h" int add( CLIENT *clnt, int x, int y) { operands ops; int *result; ops.x = x;

ops.y = y; result = add_1(&ops,clnt); if (result==NULL) { fprintf(stderr,"Trouble calling remote procedure\n"); exit(0); } return(*result); } int sub( CLIENT *clnt, int x, int y) { operands ops; int *result; ops.x = x; ops.y = y; result = sub_1(&ops,clnt); if (result==NULL) { fprintf(stderr,"Trouble calling remote procedure\n"); exit(0); } return(*result); } int main(int argc, char *argv[]) { CLIENT *clnt; int x,y; if (argc!=4) { fprintf(stderr,"Usage: %s hostname num1 num\n",argv[0]); exit(0); } clnt = clnt_create(argv[1], SIMP_PROG, SIMP_VERSION, "udp"); if (clnt == (CLIENT *) NULL) { clnt_pcreateerror(argv[1]); exit(1); } x = atoi(argv[2]); y = atoi(argv[3]); printf("%d + %d = %d\n",x,y, add(clnt,x,y)); printf("%d - %d = %d\n",x,y, sub(clnt,x,y)); return(0); } RPCSERVER.C

#include <stdio.h> #include "simp.h" int * add_1_svc(operands *argp, struct svc_req *rqstp)

{ static int result; printf("Got request: adding %d, %d\n",argp->x, argp->y); result = argp->x + argp->y; return (&result); } int * sub_1_svc(operands *argp, struct svc_req *rqstp) { static int result; printf("Got request: subtracting %d, %d\n",argp->x, argp->y); result = argp->x - argp->y; return (&result); }

OUTPUT rpc Explorer1: /* * Please do not edit this file. * It was generated using rpcgen. */ #include "simp.h" bool_t xdr_operands (XDR *xdrs, operands *objp) { register int32_t *buf; if (!xdr_int (xdrs, &objp->x)) return FALSE; if (!xdr_int (xdrs, &objp->y)) return FALSE; return TRUE; } [root@localhost sys45]# cc -o client simpclient.c simpclt.c simp_xdr.c [root@localhost sys45]# ./client 192.168.1.102 100 3 100 + 3 = 103 100 - 3 = 97 [root@localhost sys45]#

Explorer2: [root@localhost sys45]# rpcgen -c simp.x [root@localhost sys45]# cc -o server simpservice.c simpsvc.c simp_xdr.c [root@localhost sys45]# ./server Got request: adding 100, 3 Got request: subtracting 100, 3

Ex.no:8

RAWPINGER

RAWPINGER.C #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <linux/ip.h> #include <linux/icmp.h> #include <string.h> #include <unistd.h> char dst_addr[15]; char src_addr[15]; unsigned short in_cksum(unsigned short *, int); void parse_argvs(char**, char*, char* ); void usage(); char* getip(); int main(int argc, char* argv[]) { struct iphdr* ip; struct iphdr* ip_reply; struct icmphdr* icmp; struct sockaddr_in connection; char* packet; char* buffer; int sockfd; int optval; int addrlen; if (getuid() != 0) { fprintf(stderr, "%s: root privelidges needed\n", *(argv + 0)); exit(EXIT_FAILURE); } parse_argvs(argv, dst_addr, src_addr); printf("Source address: %s\n", src_addr); printf("Destination address: %s\n", dst_addr); ip = malloc(sizeof(struct iphdr)); ip_reply = malloc(sizeof(struct iphdr)); icmp = malloc(sizeof(struct icmphdr)); packet = malloc(sizeof(struct iphdr) + sizeof(struct icmphdr)); buffer = malloc(sizeof(struct iphdr) + sizeof(struct icmphdr));

ip = (struct iphdr*) packet; icmp = (struct icmphdr*) (packet + sizeof(struct iphdr)); ip->ihl = 5; ip->version = 4; ip->tos = 0; ip->tot_len = sizeof(struct iphdr) + sizeof(struct icmphdr); ip->id = htons(random()); ip->ttl = 255; ip->protocol = IPPROTO_ICMP; ip->saddr = inet_addr(src_addr); ip->daddr = inet_addr(dst_addr); if ((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) == -1) { perror("socket"); exit(EXIT_FAILURE); } setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &optval, sizeof(int)); icmp->type = ICMP_ECHO; icmp->code = 0; icmp->un.echo.id = 0; icmp->un.echo.sequence = 0; icmp->checksum = 0; icmp-> checksum = in_cksum((unsigned short *)icmp, sizeof(struct icmphdr)); ip->check = in_cksum((unsigned short *)ip, sizeof(struct iphdr)); connection.sin_family = AF_INET; connection.sin_addr.s_addr = inet_addr(dst_addr); sendto(sockfd, packet, ip->tot_len, 0, (struct sockaddr *)&connection, sizeof(struct sockaddr)); printf("Sent %d byte packet to %s\n", sizeof(packet), dst_addr); addrlen = sizeof(connection); if (recvfrom(sockfd, buffer, sizeof(struct iphdr) + sizeof(struct icmphdr), 0, (struct sockaddr *)&connection, &addrlen) == -1) { perror("recv"); } else { printf("Received %d byte reply from %s:\n", sizeof(buffer), dst_addr); ip_reply = (struct iphdr*) buffer; printf("ID: %d\n", ntohs(ip_reply->id)); printf("TTL: %d\n", ip_reply->ttl); } close(sockfd); return 0; } void parse_argvs(char** argv, char* dst, char* src) {

int i; if(!(*(argv + 1))) { usage(); exit(EXIT_FAILURE); } if (*(argv + 1) && (!(*(argv + 2)))) { strncpy(dst, *(argv + 1), 15); strncpy(src, getip(), 15); return; } else if ((*(argv + 1) && (*(argv + 2)))) { strncpy(dst, *(argv + 1), 15); i = 2; while(*(argv + i + 1)) { if (strncmp(*(argv + i), "-s", 2) == 0) { strncpy(src, *(argv + i + 1), 15); break; } i++; } } } void usage() { fprintf(stderr, "\nUsage: pinger [destination] <-s [source]>\n"); fprintf(stderr, "Destination must be provided\n"); fprintf(stderr, "Source is optional\n\n"); } char* getip() { char buffer[256]; struct hostent* h; gethostname(buffer, 256); h = gethostbyname(buffer); return inet_ntoa(*(struct in_addr *)h->h_addr); } unsigned short in_cksum(unsigned short *addr, int len) { register int sum = 0; u_short answer = 0; register u_short *w = addr;

register int nleft = len; while (nleft > 1) { sum += *w++; nleft -= 2; } if (nleft == 1) { *(u_char *) (&answer) = *(u_char *) w; sum += answer; } sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); answer = ~sum; return (answer); }

You might also like