我只写了服务端程序。服务端会了,客服端就好写了。
我的服务器功能是个小计算器。
server.c
/*socket:实现通信。客服端输入表达式经过服务器计算出结果发给客服端 */
/*服务器端创建任务:监听客户端,收到数据,发给服务端的子进程让子程序,子程序调用execlp
bc命令计算出结果给父进程,父进程传给服务器。
*/
#include <stdlib.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
char buf[1024];
int main(void)
{
pid_t pid;
int fdw[2];
int fdr[2];
int fd,opt;
pipe(fdw);
pipe(fdr);
pid =fork();
if(pid == 0)
{
dup2(fdr[1], STDOUT_FILENO);
close(fdr[0]);
dup2(fdw[0], STDIN_FILENO);
close(fdw[1]);
execlp("bc","bc",NULL);
}
else{
close(fdr[1]);
close(fdw[0]);
}
fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in s_addr,c_addr;
bzero(&s_addr, sizeof(s_addr));
s_addr.sin_family = AF_INET;
s_addr.sin_addr.s_addr = htonl(INADDR_ANY);
// s_addr.sin_port = htons(SERV_PORT);
s_addr.sin_port = htons(8000);
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,&opt, sizeof(opt));
bind(fd,(struct sockaddr *)&s_addr,sizeof(s_addr));
listen(fd, 20);
while(1){
int conn_fd,n,len;
// char buf[1024];
len = sizeof(c_addr);
conn_fd = accept(fd, (struct sockaddr*)&c_addr, &len);
n = read(conn_fd, buf, 1024);
if(buf[n - 2] == '\r')
buf[n -2] = '\n';
//写子进程fdw【0】==in
write(fdw[1], buf, n);
//读子进程fdr【1】==out
n = read(fdr[0],buf,1024);
write(conn_fd,buf,n);
close(conn_fd);
//wait(NULL);
}
return 0;
}
重定向分析:
、
打开终端运行server。
再打开一个终端输入;telnet localhost 8000
让telnet充当客服端
结果如下:
bxd:telnet localhost 8000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
3+4
7
Connection closed by foreign host.
bxd:
计算出了结果:3+4 = 7;