Socket编程(二)

简单cgi服务器

Posted by Gavin on November 19, 2019

无情最是台城柳

依旧烟笼十里堤

重定向

有时我们想把标准输入重定向到一个文件,或者把标准输出重定向到一个网络连接(比如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”