无情最是台城柳
依旧烟笼十里堤
重定向
有时我们想把标准输入重定向到一个文件,或者把标准输出重定向到一个网络连接(比如CGI编程),可以通过dup或dup2函数实现
#include <unistd.h>
int dup(int fd)
int dup2(int fd1, int fd2)
dup函数创建一个新的文件描述符,该新文件描述符与原描述符指向相同的文件、管道或网络连接。
简易CGI服务器
#include <string>
#include <cstdio>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <assert.h>
using namespace std;
int main(int argc, char const *argv[])
{
int sock = socket(PF_INET, SOCK_STREAM, 0);
assert(sock != -1);
sockaddr_in addrin;
addrin.sin_family = PF_INET;
addrin.sin_port = 8080;
addrin.sin_addr.s_addr = inet_addr("127.0.0.1");
int bind_status = bind(sock, (sockaddr*)&addrin, sizeof(addrin));
assert(bind_status == 0);
int listen_status = listen(sock,5);
assert(listen_status == 0);
socklen_t len = sizeof(addrin);
int sockfd = accept(sock,(sockaddr*)&addrin,&len);
assert(sockfd != -1);
close(STDOUT_FILENO);
dup(sockfd);
cout << "Hello World" << endl;
close(sockfd);
close(sock);
return 0;
}
简易CGI客户端
#include <iostream>
#include <string>
#include <cstdio>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <assert.h>
using namespace std;
int main(int argc, char const *argv[])
{
int sock = socket(PF_INET, SOCK_STREAM, 0);
assert(sock != -1);
sockaddr_in addrin;
addrin.sin_family = PF_INET;
addrin.sin_port = 8080;
addrin.sin_addr.s_addr = inet_addr("127.0.0.1");
socklen_t len = sizeof(addrin);
int connect_status = connect(sock,(sockaddr*)&addrin,len);
assert(connect_status != -1);
string buff(256,'\0');
int recv_status = recv(sock,const_cast<char*>(buff.c_str()),buff.length(),0);
assert(recv_status != -1);
cout << buff << endl;
close(sock);
return 0;
}
运行结果
客户端发起连接,服务器响应并将标准输出重定向到连接socket上,因此客户端收到服务器端标准输出”Hello World”