服务器端
#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;
}
先运行服务器端
再运行客户端