主要代码如下:


main()
{
/*建立socket,设置地址可以重用,绑定端口,监听*/
 ...(代码省略)
pid_tpid;
if((pid=fork())>0)/*主进程执行部分*/
{
/*执行一些进程管理任务,代码省略*/
...
}
elseif(pid==0)/*子进程执行部分*/
{
/*为表示简单,出错处理就不写出来了*/
intfd=accept(listenFd,(sturctsockaddr*)&clientAddr,&addrLen);
/*下在就是接收数据,对数据进行处理*/
...
}
}



现在问题是用一个程序来测试的时候,总是一有连接到来,就有一个子进程挂掉了,测试程序连接不上。
求高手解答,感激不尽!!!

9 个解决方案

#1


accept外面用个while吧


#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<sys/wait.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>

#definebufSize512
#definedebug1

/*s1isaTCPsocketfromaclient*/
voidhandle(ints1)
{
if(!debug)printf("%d.\n",s1);
charrequest[bufSize],buf[bufSize];
inti=0,n,fd;
charc;

/*Readtherequest(afilename)fromtheclient.*/
while(read(s1,&c,1)==1&&c!='\n'&&c!='\r'
&&i<sizeof(request)-1)
{
request[i++]=c;
if(!debug)printf("%c",c);
}
request[i]='\0';

/*Openthefile,sendthecontentstotheclient.*/
printf("Filename:%s\n",request);
fd=open(request,0);
if(fd!=-1)
{
while((n=read(fd,buf,sizeof(buf)))>0)
write(s1,buf,n);
close(fd);
}
else
fprintf(stderr,"open:Nosuchfileordirectory.\n");
close(s1);
}

intsetup(intport)
{
ints; //socketfiledescriptor
structsockaddr_insin;

/*AllocateaTCP/IPsocket.*/
//s=socket(AF_INET,SOCK_STREAM,0);
s=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
if(s==-1)
{
perror("socket");
fprintf(stderr,"socketerror\n.");
exit(1);
}

/*Listenforconnectionsonport(http).*/
bzero(&sin,sizeof(sin));
//bzero(&sin,sizeof(structsockaddr_un));
sin.sin_family=AF_INET;
//sin.sin_family=AF_UNIX;
sin.sin_port=htons(port);
sin.sin_addr.s_addr=INADDR_ANY;
if(-1==bind(s,(structsockaddr*)&sin,sizeof(sin)))
{
perror("bind");
exit(1);
}
//bind(s,(structsockaddr*)&sin,sizeof(structsockaddr_un));
fprintf(stdout,"startlistening.\n");
listen(s,8);

return(s);
}

voidserver_1(intport)
{
ints,s1,addrlen;
//structsockaddr_infrom;
structsockaddrfrom;

/*createaTCPsocketthatlistensforHTTPconnections*/
s=setup(port);

while(1){
/*Waitforanewconnectionfromaclient.*/
addrlen=sizeof(from);
s1=accept(s,&from,&addrlen);
if(!debug)printf("%d.\n",s1);
if(s1==-1)
{
perror("accept");
exit(1);
}
/*Performtheclient'srequest.*/
handle(s1);
}

}

voidserver_2(intport)
{
ints=setup(port);
inti;
for(i=0;i<1;i)
{
structsockaddrfrom;
intaddrlen=sizeof(from);
ints1=accept(s,&from,&addrlen);
/*Createanewchildprocess.*/
if(fork()==0){
/*Performtheclient’srequestinthechildprocess.*/
handle(s1);
exit(0);
}
close(s1);

/*Collectdeadchildren,butdon’twaitforthem.*/
intstatus;
waitpid(-1,&status,WNOHANG);
}
}

intmain(intargc,char*argv[])
{
if(argc!=2)
{
fprintf(stderr,"Pleasefollowtheformat:./proc_serverport(1101).\n");
exit(1);
}
server_1(atoi(argv[1]));
return1;
}

更多相关文章

  1. linux 下使用 vim+cscope+ctags+taglist+NERDtree实现代码阅读编
  2. 边学边干Linux内核指导(8)——进程调度
  3. Linux下的进程间通信
  4. 如何查看linux命令源代码和函数源代码
  5. UNIX网络编程之源代码的编译和使用
  6. mt7620的u-boot 代码
  7. 进程实际内存占用: 私有驻留内存数(Private RSS)介绍
  8. Linux内核分析-9/进程的调度时机
  9. 在arcpy中删除或删除表的代码是什么?

随机推荐

  1. Android 源码修改按键长按响应间隔
  2. Android之屏幕切换使用技巧
  3. Android 中屏幕点击事件的实现
  4. 【Android】WebView设置背景色
  5. android volley ,多文件 表单上传
  6. Android Studio v0.1尝鲜
  7. android 如何依赖android:sharedUserId更
  8. Android入门篇
  9. java websocket client ssl(wss)
  10. Shake Android ui elements