⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udp.txt

📁 LINUX下的UDP编程
💻 TXT
字号:
基于有连接的方式,客户机产生两个随机数,发送给两个服务器。服务器1(IP:192.168.0.1,port:3254)将这两个数相加;服务器2(IP:192.168.0.10,Port:3255)将这两个数相减。两个服务器分别将运算结果返回给客户机,客户机显示回传的结果。

源程序

客户端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <math.h>
#include <netdb.h>
int port1=3254;
int port2=3255;
int main(int argc,char *argv[]){
	int sockfd1,sockfd2,sentlen,recvlen1,recvlen2;
	struct sockaddr_in serveraddr1,serveraddr2;
	struct sockaddr_in clientaddr;
	struct hostent *host1,*host2;
	int *buf1[1024];
	int *buf2[1024];
	int numbytes;
	if(argc!=3){
		fprintf(stderr,"Usage:%s server_ip server_port\n",argv[0]);
		exit(1);
	}

	srand((int)time(0));
	int num1=(int)rand()%100;
	int num2=(int)rand()%100;
       printf("the two RandNums are:%d   %d\n",num1,num2);//test

	
	char string1[10];
	char string2[10];
	sprintf(string1,"%d\n",num1);
	sprintf(string2,"%d\n",num2);

       bzero(&(serveraddr1.sin_zero),8);
	host1=gethostbyname(argv[1]);
	serveraddr1.sin_family=AF_INET;
	serveraddr1.sin_port=htons(port1);
	serveraddr1.sin_addr.s_addr=htonl(INADDR_ANY);
	serveraddr1.sin_addr.s_addr=((struct in_addr *)(host1->h_addr))->s_addr;

        bzero(&(serveraddr2.sin_zero),8);
        host2=gethostbyname(argv[2]);
        serveraddr2.sin_family=AF_INET;
        serveraddr2.sin_port=htons(port2);
        serveraddr2.sin_addr.s_addr=htonl(INADDR_ANY);
        serveraddr2.sin_addr.s_addr=((struct in_addr *)(host2->h_addr))->s_addr;

	if((sockfd1=socket(AF_INET,SOCK_DGRAM,0))==-1){
		perror("socket1");
		exit(1);
	}
	if((sockfd2=socket(AF_INET,SOCK_DGRAM,0))==-1){
		perror("socket2");
		exit(1);
	}
	if((numbytes=sendto(sockfd1,string1,sizeof(string1),0,(struct sockaddr *)&serveraddr1,sizeof(struct sockaddr)))==-1){
		perror("sendto1.1");
		exit(1);
	}
	if((numbytes=sendto(sockfd1,string2,sizeof(string2),0,(struct sockaddr *)&serveraddr1,sizeof(struct sockaddr)))==-1){
		perror("sendto1.2");
		exit(1);
	}
	if((numbytes=sendto(sockfd2,string1,sizeof(string1),0,(struct sockaddr *)&serveraddr2,sizeof(struct sockaddr)))==-1){
		perror("sendto2.1");
		exit(1);
	}
	if((numbytes=sendto(sockfd2,string2,sizeof(string2),0,(struct sockaddr *)&serveraddr2,sizeof(struct sockaddr)))==-1){
		perror("sendto2.2");
		exit(1);
	}
	
	recvlen1=sizeof(serveraddr1);
	recvlen2=sizeof(serveraddr2);
	if((numbytes=recvfrom(sockfd1,buf1,sizeof(buf1),0,(struct sockaddr *)&serveraddr1,&recvlen1))==-1){
		perror("recvfrom1");
		exit(1);
	}
	if((numbytes=recvfrom(sockfd2,buf2,sizeof(buf2),0,(struct sockaddr *)&serveraddr2,&recvlen2))==-1){
		perror("recvfrom2");
		exit(1);
	}
	printf("the result of the two RandNums is:\n%d+%d=%s\n",num1,num2,buf1);
	printf("the result of the two RandNums is:\n%d-%d=%s\n",num1,num2,buf2);
	close(sockfd1);
	close(sockfd2);
	return 0;
}

服务器端(加法)

#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>

#define MYPORT 3254
 
#define BACKLOG 5
 
main(){
	int sockfd,newfd;
	int sinsize;
	struct sockaddr_in myaddr,clientaddr;
	char buf1[24];
	char buf2[24];
	char buf[24];
	int num1,num2,sum;

	sockfd=socket(AF_INET,SOCK_DGRAM,0);
	myaddr.sin_family=AF_INET;
	myaddr.sin_port=htons(MYPORT);
	myaddr.sin_addr.s_addr=INADDR_ANY;
	bzero(&(myaddr.sin_zero),8);
  	if(bind(sockfd,(struct sockaddr *)&myaddr,sizeof(struct sockaddr))==-1){
		perror("binds1 error.");
		exit(1);
	}
	while(1){
		memset(buf1,0x0,24);   
		memset(buf2,0x0,24);

		sinsize=sizeof(struct sockaddr_in);
		if(recvfrom(sockfd,buf1,sizeof(buf1),0,(struct sockaddr *)&clientaddr,&sinsize)<0){
			printf("Can'not receive data1.\n");
			continue;
		}
		if(recvfrom(sockfd,buf2,sizeof(buf2),0,(struct sockaddr *)&clientaddr,&sinsize)<0){
			printf("Can'not receive data2.\n");	
			continue;
		}
		num1=atoi(buf1);
		num2=atoi(buf2);
		sum=num1+num2;
		printf("recieve two RandNums:%d %d\n",num1,num2);
		sprintf(buf,"%d\n",sum);
		if(sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&clientaddr,sizeof(clientaddr))==-1){
			perror("sendto error.");
			exit(1);
		}
	
	}
	return 0;
}
服务器端(减法)

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>

#define MYPORT 3255 
 
#define BACKLOG 5
 
main(){
	int sockfd,newfd;
	int sinsize;
	struct sockaddr_in myaddr,clientaddr;
	char buf1[24];
	char buf2[24];
	char buf[24];
	int num1,num2,sum;

	if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){
		perror("sockets2 error.");
		exit(1);
	}
	myaddr.sin_family=AF_INET;
	myaddr.sin_port=htons(MYPORT);
	myaddr.sin_addr.s_addr=INADDR_ANY;
	bzero(&(myaddr.sin_zero),8);
	if(bind(sockfd,(struct sockaddr *)&myaddr,sizeof(struct sockaddr))==-1){
		perror("binds2 error.");
		exit(1);
	}
	while(1){
		sinsize=sizeof(struct sockaddr_in);
		if(recvfrom(sockfd,buf1,sizeof(buf1),0,(struct sockaddr *)&clientaddr,&sinsize)<0){
                        printf("Can'not receive data1.\n");
                        continue;
                }
                if(recvfrom(sockfd,buf2,sizeof(buf2),0,(struct sockaddr *)&clientaddr,&sinsize)<0){
                        printf("Can'not receive data2.\n");
                        continue;
                }
		num1=atoi(buf1);
		num2=atoi(buf2);
		sum=num1-num2;
		printf("recieve two RandNums:%d   %d\n",num1,num2);
		sprintf(buf,"%d\n",sum);
		if(sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&clientaddr,sizeof(clientaddr))==-1){    
			perror("sendto error.");
		}
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -