#include
#include
#include
#include
#include
#include
int main()
{
int fd[2]; //定义文件描述符数组
int ret = pipe(fd); //创建管道
if (ret == -1)
{
perror(“pipe”);
exit(1);
}
pid_t pid = fork();
if (pid > 0)
{
//父进程—写
close(fd[0]); //关闭读端
char *p = “hello,pipen”;
write(fd[1], p, strlen§ + 1); //写数据
close(fd[1]);
wait(NULL);
}
else if (pid == 0)
{
//子进程—读
close(fd[1]); //关闭写端
char buf[64] = { 0 };
ret = read(fd[0], buf, sizeof(buf)); //读数据
close(fd[0]);
write(STDOUT_FILENO, buf, ret); //将读到的数据写到标准输出
}
return 0;
}
2.client
#include
#include
#include
#include
#include
#include
#define MAXLINE 80
#define SERV_PORT 6666
int main(int argc, char *argv[])
{
struct sockaddr_in servaddr; //定义服务器地址结构体
char buf[MAXLINE];
int sockfd, n;
char *str;
if (argc != 2) {
fputs(“usage: ./client messagen”, stderr);
exit(1);
}
str = argv[1];
//创建客户端套接字文件
sockfd = socket(AF_INET, SOCK_STREAM, 0);
//初始化服务器端口地址
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET, “127.0.0.1”, &servaddr.sin_addr);
servaddr.sin_port = htons(SERV_PORT);
//请求链接
connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
//发送数据
send(sockfd, str, strlen(str), 0);
//接收客户端返回的数据
n = recv(sockfd, buf, MAXLINE, 0);
printf(“Response from server:n”);
//将客户端返回的数据打印到终端
write(STDOUT_FILENO, buf, n);
//关闭连接
close(sockfd);
return 0;
}
server
#include
#include
#include
#include
#include
#include
#include
#define MAXLINE 80 //最大数据长度
#define SERV_PORT 6666 //服务器端口号
int main(void)
{
struct sockaddr_in servaddr, cliaddr; //定义服务器与客户端地址结构体
socklen_t cliaddr_len; //客户端地址长度
int listenfd, connfd;
char buf[MAXLINE];
char str[INET_ADDRSTRLEN];
int i, n;
//创建服务器端套接字文件
listenfd = socket(AF_INET, SOCK_STREAM, 0);
//初始化服务器端口地址
bzero(&servaddr, sizeof(servaddr)); //将服务器端口地址清零
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
//将套接字文件与服务器端口地址绑定
bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
//监听,并设置最大连接数为20
listen(listenfd, 20);
printf(“Accepting connections …n”);
//接收客户端数据,并处理请求
while (1) {
cliaddr_len = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr )&cliaddr, &cliaddr_len);
n = recv(connfd, buf, MAXLINE, 0);
printf(“received from %s at PORT %dn”,
inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),
ntohs(cliaddr.sin_port));
for (i = 0; i < n; i++)
buf[i] = toupper(buf[i]);
send(connfd, buf, n, 0);
//关闭连接
close(connfd);
}
return 0;
}
服务器端:
#include
#include
#include
#include
#include
#include
#define DATALEN 5
#define MAXLINE 30
#define SERV_PORT 6666
float calc(char s);
int main()
{
struct sockaddr_in servaddr,cliaddr;
socklen_t cliaddr_len;
int listenfd,connfd;
char buf[MAXLINE];
char s[INET_ADDRSTRLEN];
int i,n;
//create server socket
listenfd=socket(AF_INET,SOCK_STREAM,0);
//init server port
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(SERV_PORT);
//bind
bind(listenfd,(struct sockaddr)&servaddr,sizeof(servaddr));
//listen
listen(listenfd,20);
printf(“Accepting connections…n”);
//recv and process the data from clients
while(1)
{
cliaddr_len = sizeof(cliaddr);
connfd=accept(listenfd,(structsockaddr
n=recv(connfd,buf,MAXLINE,0);
printf(“recvived form %s at PORT %dn”,inet_ntop(AF_INET,&cliaddr.sin_addr,s,sizeof(s)),ntohs(cliaddr.sin_port));
float sum;
sum = calc(buf);
char s2[DATALEN]={0};
sprintf(s2,"%.2f",sum);
send(connfd,s2,strlen(s2),0);
close(connfd);
}
return 0;
}
float calc(char s[10])
{
char *sp = " ";
char *str=strtok(s,sp); //split
char t[3]={0};
int j=0;
for(j;j<3;j++)
t[j]=(char)malloc(sizeof(char)DATALEN);
int i = 0;
strcpy(t[i],str);
while(i<2)
{
i++;
strcpy(str,strtok(NULL,sp)); //split again
strcpy(t[i],str);
}
//get and save operator
char c=0;
if(strlen(t[1])!=1)
printf(“operator error!n”);
else
c=t[1][0];
float sum;
float a=atof(t[0]);
float b=atof(t[2]);
switch©
{
case ‘+’:
sum = a + b;
break;
case ‘-’:
sum = a - b;
break;
case '’:
sum = a * b;
break;
case ‘/’:
if (b == 0)
{
printf(“divisor can’t be zero.n”);
break;
}
sum = a / b;
break;
default:
printf(“operator errorn”);
break;
}
return sum;
}
客户端:
#include
#include
#include
#include
#include
#include
#define DATALEN 5
#define MAXLINE 30
#define SERV_PORT 6666
int main()
{
struct sockaddr_in servaddr;
char buf[MAXLINE];
int sockfd,n;
read(STDIN_FILENO,buf,MAXLINE); //input string
char s1=(char)malloc(sizeof(char)DATALEN);
strcpy(s1,buf);
//client socket
sockfd=socket(AF_INET,SOCK_STREAM,0);
//init
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
inet_pton(AF_INET,“127.0.0.1”,&servaddr.sin_addr);
servaddr.sin_port=htons(SERV_PORT);
//connect
connect(sockfd,(struct sockaddr)&servaddr,sizeof(servaddr));
//send data
send(sockfd,buf,strlen(buf),0);
//recv data
n=recv(sockfd,buf,MAXLINE,0);
printf(“Response form server:n”);
//printf data
write(STDOUT_FILENO,buf,n);
//close connect
close(sockfd);
return 0;
}
编译程序并执行,在客户端中输入表达式“34 + 56”,服务器和客户端的打印情况分别如下。
服务器:
pting connections…
recvived form 127.0.0.1 at PORT 37837
客户端:
34 + 65
Response form server:
99.00
参考代码中,客户端向服务器发送一个运算式,运算式中的变量和运算符之间以空格分割,该运算式的本质是一个字符串。运算式传送到服务器端后,服务器端根据运算式中的空格分割并提取其中的变量与运算符,计算出运算结果,将结果发送给客户端,再由客户端将运算式的计算结果打印到终端。



