//服务器端代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
void error_handling(const char *msg)
{
fputs(msg,stderr);
exit(1);
}
int calc(int n,int *digs,char op)
{
int res1=0;
int res2=1;
switch(op)
{
case '+':
for(int i=0;i<n;++i)
res1+=digs[i];
return res1;
case '*':
for(int i=0;i<n;++i)
res2*=digs[i];
return res2;
}
}
int main(int argc,char *argv[])
{
int serv_sock,clnt_sock;
struct sockaddr_in serv_adr,clnt_adr;
socklen_t clnt_adr_sz;
int opd,result,tmp,digs[25];
char sym;
if(argc!=2)
{
printf("Usage:%s <port>",argv[0]);
exit(1);
}
serv_sock=socket(PF_INET,SOCK_STREAM,0); //第一步
if(serv_sock==-1)
error_handling("socket() error\n");
memset(&serv_adr,0,sizeof(serv_adr));
serv_adr.sin_family=AF_INET;
serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_adr.sin_port=htons(atoi(argv[1]));
if(bind(serv_sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr))==-1) //第二步
error_handling("bind() error\n");
if(listen(serv_sock,5)==-1)
error_handling("listen() error\n");
for(int i=0;i<5;++i)
{
clnt_adr_sz=sizeof(clnt_adr);
clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_adr,&clnt_adr_sz); //第三步
if(clnt_sock==-1)
error_handling("accept() error\n");
printf("Connected %d......\n",i+1);
read(clnt_sock,&opd,1); //读取第一个字节,因为opd是int类型,会发生自动char->int转换
for(int k=0;k<opd;++k)
{
read(clnt_sock,&tmp,4); //也会发生类型转换
digs[k]=tmp; //保存到digs数组中
}
read(clnt_sock,&sym,1); //读取最后的操作数
result=calc(opd,digs,sym); //调用calc()函数
write(clnt_sock,&result,sizeof(result)); //将结果发送回去
close(clnt_sock); //关闭
}
return 0;
}
//客户端代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define MAXN 1024
#define OPSZ 4
void error_handling(const char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
int main(int argc,char *argv[])
{
int clnt_sock;
struct sockaddr_in serv_adr;
char msg[MAXN];
int opd,result;
if(argc!=3)
{
printf("Usage %s <IP> <PORT>",argv[0]);
exit(1);
}
clnt_sock=socket(PF_INET,SOCK_STREAM,0); //第一步
if(clnt_sock==-1)
error_handling("socket() error");
memset(&serv_adr,0,sizeof(serv_adr)); //填充要连接的服务器端的地址
serv_adr.sin_family=AF_INET;
serv_adr.sin_addr.s_addr=inet_addr(argv[1]);
serv_adr.sin_port=htons(atoi(argv[2]));
if(connect(clnt_sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr))==-1)
error_handling("connect() error");
else
printf("connected...\n"); //成功连接之后
printf("Operand count:");
scanf("%d",&opd);
msg[0]=(char)opd; //强制类型转换
for(int i=0;i<opd;++i)
{
printf("Operand %d:",i+1);
scanf("%d",(int *)&msg[i*OPSZ+1]); //4字节int型数据要保存到char数组,因而转换成int指针类型
}
fgetc(stdin); //读取流中还剩的回车
fputs("Operator: ",stdout);
scanf("%c",&msg[opd*OPSZ+1]); //保存操作符(+ - *)中的一个
write(clnt_sock,msg,opd*OPSZ+2); //发送数据给客户端
read(clnt_sock,&result,4); //接收服务器端发送的数据
printf("Operation result:%d \n",result);
close(clnt_sock);
return 0;
}