unix 域套接字 问题

viki34 2013-07-08 08:34:02
                           
25 int var;
26 var=fcntl(sockfd,F_GETFL,0);
27 if(var&O_NONBLOCK)
28 {
29 cout<<"O_NONBLOCK"<<endl;
30 }//判断是一个阻塞的套接字
31 while(1)
32 {
33 if((connfd=accept(sockfd,(SA*)&addr2,&len))<0)
34 {
35 perror("accept");
36 if(errno==EINTR)
37 {
38 cout<<errno<<endl;
39 continue;
40 }
41 return -1;
42 }
43 int pid;
44 pid=fork();
45 if(pid==0)
46 {
47 char recv1[1024];
48 close(sockfd);
49 recv(connfd,recv1,1024,0);
50 cout<<recv1<<endl;
51 close(connfd);
52 }
53 close(connfd);
54 }

这是服务端的程序

struct sockaddr_un addr;
6 addr.sun_family=AF_LOCAL;
7 bzero(addr.sun_path,sizeof(addr));
8 strcpy(addr.sun_path,"a.sock");
9 int sockfd;
10 sockfd=socket(AF_LOCAL,SOCK_STREAM,0);
11 if(connect(sockfd,(SA*)&addr,sizeof(addr))<0)
12 {
13 perror("connect");
14 exit(-1);
15 }
16 send(sockfd,"aa",2,0);
17 close(sockfd);

出现了奇怪的现象,服务器运行后,启动客户端,服务器可以收到‘aa’,
然后紧接着,服务端就在accept出报错,bad file descriptor
服务器程序也没有crash,还一直在运行,继续启动客户端,服务器还是照常收到aa,然后报错bad file descriptor
...全文
395 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
测试230 2013-08-16
  • 打赏
  • 举报
回复
子进程在accept 之前已经CLOSE过了,也就是说这个时候你的监听SOCKET的引用计数已经为1了,所以你子进程执行accept()会报错
viki34 2013-07-09
  • 打赏
  • 举报
回复
是因为子进程没有exit,从而进入循环,子进程执行accept(),报错退出,而父进程还在,所以就会出现,报错,但是进程没有退出; 可是为什么子进程会accept 报错呢????子进程也应该阻塞在那里才对 呀。 难道是因为父子进程套接字相同,报错的吗???? CSDN 好冷清。。
viki34 2013-07-08
  • 打赏
  • 举报
回复
上面是服务端的程序。

4,453

社区成员

发帖
与我相关
我的任务
社区描述
云计算 云安全相关讨论
社区管理员
  • 云安全社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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