udp

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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值