热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

用fork创建子进程实现持久连接问题。我在现在等。急

用fork创建子进程实现持久连接问题。我在现在等。急--Linux通用技术-Linux技术与应用信息,下面是详情阅读。
服务器端的 全部代码。连接时候总是显示 等待。。。
是哪里不对了。运行时没有错误。但是就是打不开网页。
是waitpid()的问题吗?还是fork()用错了?

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define LINESIZE 1024
#define MAXPENDING 20
#define MAXDIRLEN 256

void *service_thread(void *arg);
void do_HTTPservice(int clnt_sock);
void send_file(int clnt_sock,char *file_name);
void send_error400(int clnt_sock);
void send_error404(int clnt_sock);
void exit_error(char *error_message);
void zombie_collector(int cpid);
int read_line(int clnt_sock,char *line);

int *csock;
char base_dir[]="/home/class10/acyang/acyang/http/";

int main(int argc,char **argv)
{
int cpid;
int serv_sock;
int clnt_sock;

struct sockaddr_in serv_addr;
struct sockaddr_in clnt_addr;
struct sigaction sig_handler;

int caddr_len;
unsigned short serv_port;
pthread_t tid;

if(argc!=2){
printf("Usage: %s\n",argv[0]);
exit(0);
}

serv_port=atoi(argv[1]);

if((serv_sock=socket(AF_INET,SOCK_STREAM,0))<0)
exit_error("socket() failed");

memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_addr.sin_port=htons(serv_port);

if(bind(serv_sock,(struct sockaddr *)&serv_addr,sizeof(serv_addr))==-1)
exit_error("bind() error");
if(listen(serv_sock,MAXPENDING)==-1)
exit_error("listen() error");

//sig_handler.sa_handler=zombie_collector;
sig_handler.sa_flags-SA_RESTART;


while(1){
caddr_len=sizeof(clnt_addr);
if((clnt_sock=accept(serv_sock,(struct sockaddr *)
&clnt_addr,&caddr_len))<0)
exit_error("accept() failed");
clnt_sock=accept(serv_sock,(struct sockaddr *)&clnt_addr,&caddr_len);

if((cpid=fork())<0)
exit_error("fork() failed");
if(cpid==0)
{
if((csock=(int *)malloc(sizeof(csock)))==NULL)
exit_error("malloc() error");

close(serv_sock);
*csock=clnt_sock;
if((pthread_create(&tid,NULL,service_thread,(void *)csock))!=0)
exit_error("pthread_create() failed");
exit(0);
}
close(clnt_sock);
}
return 0;
}
void zombie_collector(int cpid){
int zid;
while((zid=waitpid(cpid,NULL,0))>0);
if(zid==-1&&errno!=ECHILD)
exit_error("waitpid() failed");
}


void *service_thread(void *arg)
{
int csock;

pthread_detach(pthread_self());
csock=*(int *)arg;
free(arg);

do_HTTPservice(csock);
close(csock);
}

void do_HTTPservice(int clnt_sock)
{
int line_len;
char req_line[LINESIZE];
char method[5];
char file_name[128];
char path_name[MAXDIRLEN];

while(line_len=read_line(clnt_sock,req_line)){
if(strstr(req_line,"HTTP")){
strcpy(method,strtok(req_line," "));
strcpy(file_name,strtok(NULL," "));
}
}
if(strcmp(method,"GET")!=0){
send_error400(clnt_sock);
}
strcpy(path_name,base_dir);
if(file_name[0]=='/')
strcat(path_name,file_name+1);
else
strcat(path_name,file_name);

send_file(clnt_sock,path_name);
}


int read_line(int sock,char *line)
{
char buf[LINESIZE];
int len,pos;
char ch;

pos=0;

while(1){
ch='\0';
len=recv(sock,&ch,1,0);

if(len<0)
exit_error("recv() error in read_line()\n");

if(len==0){
strcpy(line,buf);
return pos;
}
buf[pos++]=ch;
if((pos>=1)&&(buf[pos-1]=='\n')){
if((pos>=2)&&(buf[pos-2]=='\r')){
buf[pos-2]='\0';
pos-=2;
break;
}
else{
buf[pos-1]='\0';
pos-=1;
break;
}
}
}
strcpy(line,buf);
return(pos);
}


void send_file(int clnt_sock,char *path_name)
{
FILE * fp;
char status[]="HTTP/1.1 200 OK\r\n";
char server[]="server: My HTTP Server \r\n";
char conn[]="Connection: Close \r\n";
char clength[]="Content-length:1024 \r\n";
char ctype[]="Content-type: text/html\r\n\r\n";
char buf[LINESIZE];
if((fp=fopen(path_name,"r"))==NULL){
send_error404(clnt_sock);
return;
}
send(clnt_sock,status,sizeof(status),0);
send(clnt_sock,server,sizeof(server),0);
send(clnt_sock,conn,sizeof(conn),0);
send(clnt_sock,clength,sizeof(clength),0);
send(clnt_sock,ctype,sizeof(ctype),0);

while(fgets(buf,LINESIZE,fp)!=NULL)
{
strtok(buf,"\n");
send(clnt_sock,buf,strlen(buf),0);
}
fclose(fp);
}


void send_error400(int clnt_sock)
{
char protocol[]="http/1.1 400 Bad request\r\n";
char server[]="server: My HTTP Server \r\n";
char conn[]="Connection: Close \r\n";
char clength[]="Content-length:1024 \r\n";
char ctype[]="Content-type: text/html\r\n\r\n";
char message[]=" 400:\
Bad Request Method!
";
send(clnt_sock,protocol,sizeof(protocol),0);
send(clnt_sock,server,sizeof(server),0);
send(clnt_sock,conn,sizeof(conn),0);
send(clnt_sock,clength,sizeof(clength),0);
send(clnt_sock,ctype,sizeof(ctype),0);
send(clnt_sock,message,sizeof(message),0);
}

void send_error404(int clnt_sock)
{
char protocol[]="http/1.1 400 Not Found\r\n";
char server[]="server: My HTTP Server \r\n";
char conn[]="Connection: Close \r\n";
char clength[]="Content-length:1024 \r\n";
char ctype[]="Content-type: text/html\r\n\r\n";
char message[]=" 404 FIle:\
Not found!
";

send(clnt_sock,protocol,sizeof(protocol),0);
send(clnt_sock,server,sizeof(server),0);
send(clnt_sock,conn,sizeof(conn),0);
send(clnt_sock,clength,sizeof(clength),0);
send(clnt_sock,ctype,sizeof(ctype),0);
send(clnt_sock,message,sizeof(message),0);
}
void exit_error(char *error_message)
{
perror(error_message);
exit(1);
}
推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Lodop中特殊符号打印设计和预览样式不同的问题解析
    本文主要解析了在Lodop中使用特殊符号打印设计和预览样式不同的问题。由于调用的本机ie引擎版本可能不同,导致在不同浏览器下样式解析不同。同时,未指定文字字体和样式设置也会导致打印设计和预览的差异。文章提出了通过指定具体字体和样式来解决问题的方法,并强调了以打印预览和虚拟打印机测试为准。 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • 本文介绍了求解gcdexgcd斐蜀定理的迭代法和递归法,并解释了exgcd的概念和应用。exgcd是指对于不完全为0的非负整数a和b,gcd(a,b)表示a和b的最大公约数,必然存在整数对x和y,使得gcd(a,b)=ax+by。此外,本文还给出了相应的代码示例。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Microsoft Office for Mac最新版本安装教程,亲测可用!
    本文介绍了Microsoft Office for Mac最新版本的安装教程,经过亲测可用。Office工具是办公必备的工具,它为用户和企业设计,可以利用功能强大的Outlook处理电子邮件、日历和通讯录事宜。安装包包括Word、Excel、PPT、OneNote和Outlook。阅读本文可以了解如何下载并安装Office,以及安装过程中的注意事项。安装完毕后,可以正常使用Office中的Word等功能。 ... [详细]
  • 电销机器人作为一种人工智能技术载体,可以帮助企业提升电销效率并节省人工成本。然而,电销机器人市场缺乏统一的市场准入标准,产品品质良莠不齐。创业者在代理或购买电销机器人时应注意谨防用录音冒充真人语音通话以及宣传技术与实际效果不符的情况。选择电销机器人时需要考察公司资质和产品品质,尤其要关注语音识别率。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 学习笔记(34):第三阶段4.2.6:SpringCloud Config配置中心的应用与原理第三阶段4.2.6SpringCloud Config配置中心的应用与原理
    立即学习:https:edu.csdn.netcourseplay29983432482?utm_sourceblogtoedu配置中心得核心逻辑springcloudconfi ... [详细]
author-avatar
黑小羊Mark
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有