SOCKET 长连接

netreptile 2007-06-30 11:38:08
是否能给一个SOCKET长连接,客户端异常退出,服务器重启并在accept阻塞的列子呢?
...全文
163 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Avoid 2007-07-01
  • 打赏
  • 举报
回复
这账结的。。。
mymtom 2007-06-30
  • 打赏
  • 举报
回复
客户端断开,服务器recv会返回0,这时候你就要退出线程了。不然会是个死循环,不停的收到0
----------------
recv返回0,有点奇怪哦,read回返回0表示EOF,如果recv真返回0,只好退出了!
mymtom 2007-06-30
  • 打赏
  • 举报
回复
if(errno==EINTR)
{
continue;
}
改成下面试试:
if(errno==EINTR || errno == ECONNABORTED)
{
continue;
}
Avoid 2007-06-30
  • 打赏
  • 举报
回复
客户端断开,服务器recv会返回0,这时候你就要退出线程了。不然会是个死循环,不停的收到0
mymtom 2007-06-30
  • 打赏
  • 举报
回复
大致看了一下,步骤都是对的,现在出现有什么问题了?
netreptile 2007-06-30
  • 打赏
  • 举报
回复
这个是我的程序,帮我看看哪里有问题呢
netreptile 2007-06-30
  • 打赏
  • 举报
回复
int main(int argc,char ** argv)
{
int connfd;
pid_t childpid;
socklen_t clilen;
int read_count=0;
struct sockaddr_in cliaddr,servaddr;
static int process_count=0;

listenfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
inet_pton(AF_INET,SERV_IP,&servaddr.sin_addr);

servaddr.sin_port=htons(SERV_PORT);
bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
if (listen(listenfd,LISTENQ)<0){
printf("%s\n","listen fail\n");
}else
printf("%s\n","listen ok\n");

/*安装信号处理器*/
if(signal(SIGINT,sig_int)==SIG_ERR)
{
printf("signal error\n");
return;
}

for(;;)
{
clilen=sizeof(cliaddr);
if((connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&clilen))<0)
{
printf("accept fail\n");
if(errno==EINTR)
{
continue;
}
else
{
printf("%s\n","accept error\n");
exit(0);
}
}
if((childpid = fork()) == 0)
{
close(listenfd);
bank_process(connfd);
exit(0);
}
printf("childpid=%d\n",childpid);
close(connfd);
}
}
mymtom 2007-06-30
  • 打赏
  • 举报
回复
用fork多进程,何必重启服务器呢?
netreptile 2007-06-30
  • 打赏
  • 举报
回复
toAvoid(千金散去还复来) 我现在出现的问题就和你所说的问题一样,我改进了一下,while(waitpid(-1,NULL,WHONHANG)>0);

23,128

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧