Linux中用socket通信 实现简单的数学运算

服务器端
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
#include<sys/un.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<netdb.h>
#include<signal.h>
#include<ctype.h>

#define PORT  5000
//获取子进程退出信号 在退出时给出提示信息

typedef struct{
		double x;
		double y;
		char s[10];
		char echo_buf[1024];
}Mes;

int main(int argc ,char *argv[])
{
		socklen_t clt_addr_len;
		int listen_fd;
		int com_fd;
		int i;
		static char send_buf[1024];
		int len;
		int port;
		pid_t pid;

		struct sockaddr_in clt_addr;
		struct sockaddr_in srv_addr;

		//服务器端运行时要给出端口信息  该端口为监听端口
		//创建套接字用于服务的监听

		listen_fd = socket(PF_INET,SOCK_STREAM,0);
		if(listen_fd == -1){
				perror("不能创建监听套接字\n");
				exit(1);
		}
		memset(&srv_addr,0,sizeof(srv_addr));
		srv_addr.sin_family = AF_INET;
	    srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);	
		srv_addr.sin_port = htons(PORT);

		int t=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
		if(t==-1){
				perror("不能绑定服务器套接字\n");
				exit(1);
		}
		
		t=listen(listen_fd,20);
		if(t==-1){
				perror("无法监听客户端连接请求\n");
				close(listen_fd);
		}
		bzero(send_buf,1024);
		while(1)
		{
				len = sizeof(clt_addr);
				com_fd = accept(listen_fd,(struct sockaddr*)&clt_addr,&len);
				if(com_fd < 0){
						if(errno == EINTR){
								continue;
						}
						else{
								perror("不能接受客户端连接请求\n");
								close(listen_fd);
								exit(1);
						}
				}
				pid = fork();
				if(pid < 0){
						perror("不能创建子进程\n ");
						close(listen_fd);
						exit(1);
				}else if(pid == 0){
						Mes mes;
						int n=sizeof(mes);

						
						while((len = read(com_fd,&mes,n))>0){

								if(strcmp(mes.s,"echo")!=0){
								printf("Message from client(%d):%s %.2lf %.2lf\n",len,mes.s,mes.x,mes.y);
								if(send_buf[0]=='@'){
										break;
								}
								
								double result =  0;
								if(strcmp(mes.s,"add")==0){
										printf("你正在进行加法运算.\n");
										result = mes.x+mes.y;
								}else if(strcmp(mes.s,"sub")==0){
										printf("你正在进行减法运算.\n");
										result = mes.x - mes.y;
								}else if(strcmp(mes.s,"mul")==0){
										printf("你正在进行乘法运算.\n");
										result = mes.x * mes.y;
								}else if(strcmp(mes.s,"div")==0){
										printf("你正在进行除法运算.\n");
										if(mes.y == 0){
												printf("除数为 0 运算无意义!\n ");
												result == 0;
										}else{
												result = mes.x / mes.y;
										}
								}else{
										printf("无操作,请检查!\n");
								}
								printf("计算的结果为:result = %.2lf\n",result);
								if(mes.y == 0 && (strcmp(mes.s,"div") == 0)){
										sprintf(send_buf,"%s","除数为0 操作无效");
								}else{
								sprintf(send_buf,"%.2lf",result);
								}
							}else{
						//			
									printf("客户端的消息为:%s\n",mes.echo_buf);
									printf("服务端需要回复的消息为:");
									fgets(send_buf,1024,stdin);
							}

								write(com_fd,send_buf,strlen(send_buf));
								
						}
								close(com_fd);
								return 0;
						}else{
								close(com_fd);
						}
		}

						return 0;
}
客户端

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

#define PORT 5000

typedef struct{
	double x;
	double y;
	char s[10];
	char echo_buf[1024];
}Mes;

int main(int argc,char *argv[])
{
	int connect_fd;
	int ret;
	char recv_buf[1024];
	int i;
	int port;
	int len;


	static struct sockaddr_in srv_addr;

	if(argc!=1){
		printf("Usage:%s server_ip_address port \n",argv[0]);
		exit(1);
	}

	connect_fd = socket(PF_INET,SOCK_STREAM,0);
	if(connect_fd < 0){
		perror("不能创建通信套接字\n");
		exit(1);
	}


	memset(&srv_addr,0,sizeof(srv_addr));
	srv_addr.sin_family = AF_INET;
	srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	srv_addr.sin_port = htons(PORT);

	if((connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr)))==-1){
		perror("不能到服务器\n");
		close(connect_fd);
		exit(1);
	}

	memset(recv_buf,0,1024);

	while(1){

		Mes mes;
		int n=sizeof(mes);
		printf("请输入表达式:\n");
		scanf("%s",mes.s);
		if(strcmp(mes.s,"echo")==0){
			fgets(mes.echo_buf,1024,stdin);
			mes.x = 0;
			mes.y = 0;
		}else{
		scanf("%lf%lf",&mes.x,&mes.y);
		sprintf(mes.echo_buf,"%s","NULL");
		}
		write(connect_fd,&mes,n);
		len = read(connect_fd,recv_buf,n);
		if(strcmp(mes.s,"echo")==0){
			printf("服务器回复的消息:%s\n",recv_buf);
		}else if(len > 0){
			double result;
			sscanf(recv_buf,"%lf",&result);
			printf("计算的结果:%.2lf\n",result);

			if(recv_buf[0] == '@')
				break;
		}
	}
	close(connect_fd);
	return 0;
}


先运行服务器端

再运行客户端


猜你喜欢

转载自blog.csdn.net/XieTeTe/article/details/78806850
今日推荐