op_server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 1024
#define RTL_SIZE 4
#define OPSE 4
#define SERVER_IP "127.0.0.1"
void error_handing(const char *message);
int calculate(int opnum,int* opnds,char oprator);
int main(int argc, char const *argv[])
{
if (argc != 2)
{
printf("Usage %s <port> \n",argv[0]);
exit(1);
}
int serv_fd = socket(PF_INET,SOCK_STREAM,0);
if (serv_fd == -1)
{
error_handing("socket() error");
}
struct sockaddr_in serv_addr;
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
serv_addr.sin_port = htons(atoi(argv[1]));
if(bind(serv_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -1)
{
error_handing("bind() error");
}
if(listen(serv_fd,5) == -1)
{
error_handing("listen() error");
}
struct sockaddr_in clie_addr;
memset(&clie_addr,0,sizeof(clie_addr));
socklen_t clie_len = sizeof(clie_addr);
int i;
for (i = 0;i<5;i++)
{
int clie_fd = accept(serv_fd,(struct sockaddr *)&clie_addr,&clie_len);
if (clie_fd == -1)
{
error_handing("accept() error");
}
printf("client ip:%s,port:%d\n",inet_ntoa(clie_addr.sin_addr),ntohs(clie_addr.sin_port));
int opnd_cnt = 0;
char opinfo[BUF_SIZE] = { 0 };
read(clie_fd,&opnd_cnt,1); //先读取一个字节数据
int recv_len = 0;
int recv_cnt = 0;
while((opnd_cnt * OPSE + 1) > recv_len)
{
recv_cnt = read(clie_fd,&opinfo[recv_len],OPSE);
recv_len += recv_cnt;
}
int result = calculate(opnd_cnt,(int*)opinfo,opinfo[recv_len - 1]);
write(clie_fd,&result,OPSE);
close(clie_fd);
}
close(serv_fd);
return 0;
}
void error_handing(const char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
int calculate(int op_cnt, int* message, char op)
{
int result = *message++;
switch (op)
{
case '+':
{
while (--op_cnt > 0)
{
result += *message++;
}
break;
}
case '-':
{
while (--op_cnt > 0)
{
result -= *message++;
}
break;
}
case '*':
{
while (--op_cnt > 0)
{
result *= *message++;
}
break;
}
case '/':
{
while (--op_cnt > 0)
{
result /= *message++;
}
break;
}
}
return result;
}
op_client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 1024
#define RTL_SIZE 4
#define OPSE 4
void error_handing(const char *message);
int main(int argc, char const *argv[])
{
if(argc != 3)
{
printf("Usage : %s <IP> <port>\n",argv[0] );
}
int clie_fd = socket(PF_INET,SOCK_STREAM,0);
if (clie_fd == -1)
{
error_handing("socket() error");
}
struct sockaddr_in clie_addr;
memset(&clie_addr,0,sizeof(clie_addr));
clie_addr.sin_family = AF_INET;
clie_addr.sin_addr.s_addr = inet_addr(argv[1]);
clie_addr.sin_port = htons(atoi(argv[2]));
if(connect(clie_fd,(struct sockaddr *)&clie_addr,sizeof(clie_addr)) == -1)
{
error_handing("connect() error");
}
puts("Connected............");
int opnd_cnt;
fputs("Operand count: ",stdout);
scanf("%d",&opnd_cnt);
char opmsg[BUF_SIZE];
memset(&opmsg,0,sizeof(opmsg));
opmsg[0] = (char)opnd_cnt;
int i;
for (i = 0;i<opnd_cnt;i++)
{
printf("Operand %d: ",i+1);
scanf("%d",(int*)&opmsg[i*OPSE + 1]);
}
fgetc(stdin);
fputs("Operator: ",stdout);
scanf("%c",&opmsg[opnd_cnt*OPSE + 1]);
write(clie_fd,opmsg,opnd_cnt*OPSE + 2);
int result = 0;
read(clie_fd,&result,RTL_SIZE);
printf("Operation result: %d\n",result );
close(clie_fd);
return 0;
}
void error_handing(const char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}