服务端将标准输出关闭并立即调用dup复制该文件描述符到socket上,则客户端收到的是服务端的标准输出流
服务端程序:
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<assert.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<iostream>
using namespace std;
int main(int argc,char* argv[]){
if(argc<=2)
cout<<"argc<=2"<<endl;
const char* ip=argv[1];
int port=atoi(argv[2]);
struct sockaddr_in address;
bzero(&address,sizeof(address));
address.sin_family=AF_INET;
inet_pton(AF_INET,ip,&address.sin_addr);
address.sin_port=htons(port);
int sock=socket(PF_INET,SOCK_STREAM,0);
assert(sock>=0);
int ret=bind(sock,(struct sockaddr*)&address,sizeof(address));
assert(ret!=-1);
ret=listen(sock,5);
assert(ret!=-1);
struct sockaddr_in client;
socklen_t client_addrlength=sizeof(client);
while(1){
int connfd=accept(sock,(struct sockaddr*)&client,&client_addrlength);
if(connfd<0)
cout<<"accept error "<<errno<<endl;
else{
close(STDOUT_FILENO);
dup(connfd);
cout<<"abcd"<<endl;
close(connfd);
}
}
close(sock);
return 0;
}
客户端程序:
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<assert.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<iostream>
using namespace std;
int main(int argc,char* argv[]){
if(argc<=2)
cout<<"argc<=2"<<endl;
const char* ip=argv[1];
int port=atoi(argv[2]);
struct sockaddr_in address;
bzero(&address,sizeof(address));
address.sin_family=AF_INET;
inet_pton(AF_INET,ip,&address.sin_addr);
address.sin_port=htons(port);
int sock=socket(PF_INET,SOCK_STREAM,0);
assert(sock>=0);
if(connect(sock,(struct sockaddr*)&address,sizeof(address))<0)
cout<<"connect error "<<errno<<endl;
else{
cout<<"recv "<<endl;
char buffer[1024];
memset(buffer,'\0',1024);
int ret=recv(sock,buffer,1024-1,0);
cout<<buffer<<endl;
}
close(sock);
return 0;
}
执行:
./cgi_server 192.168.1.109 12345
./cgi_server 192.168.1.109 12345
输出结果: