CGI服务器主要是通过把服务器本地标准输入,输出或者文件重定向到网络连接中,这样我们就能够通过向标准输入,输出缓冲区中发送信息,达到在网络连接中发送信息的效果.,(简单理解。。。。)
这里主要注意点是我们要进行fflush(),通过dup进行重定向
cgi.c
int main(int argc,char** argv) {
if (argc != 2) {
printf("please add ");
return 1;
}
int sockfd;
if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0) {
printf("socket error: %s
",strerror(errno));
return 1;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(atoi(argv[1]));
if (bind(sockfd,(struct sockaddr*)&addr,sizeof(addr)) < 0) {
printf("bind error: %s
",strerror(errno));
return 1;
}
if (listen(sockfd,LISTENQ) < 0) {
printf("listen error: %s
",strerror(errno));
return 1;
}
int connfd;
for ( ; ;) {
if ((connfd = accept(sockfd,NULL,NULL)) < 0) {
if (errno == EINTR) {
continue;
}
printf("accept error: %s
",strerror(errno));
return 1;
}
int ret = close(STDOUT_FILENO);
if (ret < 0) {
printf("close error: %s",strerror(errno));
exit(1);
}
if (dup(connfd) < 0) {
printf("dup error: %s
",strerror(errno));
return 1;
}
printf("which is server send by STDOUT_FILENO
");
fflush(stdout);
close(connfd);
}
return 0;
}
通过telnet测试: