基于有连接的方式,客户机产生两个随机数,发送给两个服务器。服务器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;
}
评论0