udpsever.c
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<sys/wait.h>
#define MYPORT 5000
#define MAXBUFLEN 100
int main()
{
int sockfd;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int addr_len,numbytes;
char buf[MAXBUFLEN],out[MAXBUFLEN];
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
{
perror("socket");
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(MYPORT);
my_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
addr_len=sizeof(struct sockaddr);
if((numbytes=recvfrom(sockfd,buf,MAXBUFLEN,0,(struct sockaddr*)&their_addr,&addr_len))==-1)
{
perror("recvfrom");
exit(1);
}
printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr));
printf("packet is %d byte long\n",numbytes);
buf[numbytes]='\0';
printf("packet contains \"%s\"\n",buf);
FILE *fp;
int i=0;
if((fp=popen(buf,"r"))==NULL)
while((out[i]=fgetc(fp))!=EOF && i<MAXBUFLEN)
i++;
if((numbytes=sendto(sockfd,out,strlen(out),0,(struct sockaddr*)&their_addr,sizeof(struct sockaddr)))==-1)
{
perror("recvfrom");
exit(1);
}
printf("Send %d bytes to %s\n",numbytes,inet_ntoa(their_addr.sin_addr));
printf("%s\n",out);
close(sockfd);
return 0;
}
udpclient.c
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#define MYPORT 5000
#define MAXBUFLEN 100
int main(int argc,char *argv[])
{
int sockfd,numbytes,len;
struct hostent *he;
struct sockaddr_in their_addr;
char buf[MAXBUFLEN],out[MAXBUFLEN];
if(argc!=3)
{
fprintf(stderr,"usage:talker hostname\n");
exit(1);
}
if((he=gethostbyname(argv[1]))==NULL)
{
herror("gethostbyname");
exit(1);
}
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
{
perror("socket");
exit(1);
}
their_addr.sin_family=AF_INET;
their_addr.sin_port=htons(MYPORT);
their_addr.sin_addr=*((struct in_addr*)he->h_addr);
bzero(&(their_addr.sin_zero),8);
if((numbytes=sendto(sockfd,argv[2],strlen(argv[2]),0,\
(struct sockaddr*)&their_addr,sizeof(struct sockaddr)))==-1)
{
perror("recvfrom");
exit(1);
}
printf("Send %d bytes to %s\n",numbytes,inet_ntoa(their_addr.sin_addr));
printf("The result is:\n");
len=sizeof(struct sockaddr);
if((numbytes=recvfrom(sockfd,buf,MAXBUFLEN,0,\
(struct sockaddr*)&their_addr,&len))==-1)
{
perror("recvfrom");
exit(1);
}
buf[numbytes]='\0';
printf("%d\n",numbytes);
printf("%s\n",buf);
close(sockfd);
return 0;
}