免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5686 | 回复: 19
打印 上一主题 下一主题

fork与socket的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-26 11:23 |只看该作者 |倒序浏览
#include <iostream.h>
#include <netinet/in.h>
#include<arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
int main()
{
       pid_t pid;
        int iSocket,iReturn;
        struct sockaddr_in seraddr;
        int nbytes;
        char sendbuf[1024];
        char recvbuf[2048];

        seraddr.sin_port = htons(10001);
        seraddr.sin_family = AF_INET;
        seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
        iSocket = socket(AF_INET,SOCK_STREAM,0);
        if(iSocket < 0)
        {
                perror("create socket error:");
                return -1;
        }
        if   ((pid   =   fork   ())   >   0)
        {
                sleep(20);      
                cout<<"parent iSocket="<<iSocket<<endl;
           if(connect(iSocket,(struct sockaddr *)&seraddr, (int)sizeof(struct sockaddr_in)) < 0)
           {
                   perror("parent connect server error:");
                   return -1;
           }
                close(iSocket);
                exit(0);
        }//exit   (0);
        else
        {
          cout<<"parent iSocket="<<iSocket<<endl;  
         if(connect(iSocket,(struct sockaddr *)&seraddr, (int)sizeof(struct sockaddr_in)) < 0)
              {
                 perror("child connect server error:");
            return -1;
               }
               close(iSocket);
        exit(0);        
        }
}
hp unix 下结果是parent connect server error:: Socket is already connected
fork子进程复制父进程的资源,为什么子进程close(socket)后,父进程还是连接状态,请大家帮忙分析下

论坛徽章:
0
2 [报告]
发表于 2007-09-26 11:51 |只看该作者
本来就是如此。fork后,2个进程各自独立了。
fork子进程复制父进程的资源,为什么子进程close(socket)后,父进程还是连接状态,请大家帮忙分析下

论坛徽章:
0
3 [报告]
发表于 2007-09-26 12:15 |只看该作者
close只是关闭描述符,如果只有这一个描述符引用socket才会断开连接

论坛徽章:
0
4 [报告]
发表于 2007-09-26 12:57 |只看该作者
flw2:
close需要发送fin消息包的,不是只是关闭描述符吧

论坛徽章:
0
5 [报告]
发表于 2007-09-26 13:00 |只看该作者
父进程和子进程的iSocket都指向文件表中的同一个项目,该文件被标记为打开了两次,因此子进程进行了连接以后,虽然过后把它关了,但是父进程的iSocket依然有效,该文件的打开次数还不为0,所以就会出现这样的错误吧。不知道是不是这样

论坛徽章:
0
6 [报告]
发表于 2007-09-26 13:03 |只看该作者
原帖由 leiyu 于 2007-9-26 12:57 发表
flw2:
close需要发送fin消息包的,不是只是关闭描述符吧


如果是引用次数为0的时候才发送fin包呢?

论坛徽章:
0
7 [报告]
发表于 2007-09-26 13:19 |只看该作者
haha,又学了很多东西

论坛徽章:
0
8 [报告]
发表于 2007-09-26 13:20 |只看该作者
发现个问题,就是父fork子后反映巨慢,即使去掉子的connect也一样

论坛徽章:
0
9 [报告]
发表于 2007-09-26 13:21 |只看该作者
原帖由 ddvv 于 2007-9-26 13:03 发表


如果是引用次数为0的时候才发送fin包呢?

是的,如果用shutdown代替的话就不管三七二十把文件描述符给关了,呵呵

论坛徽章:
0
10 [报告]
发表于 2007-09-26 13:25 |只看该作者
恩,相关的内容可以看一下APUE和Unix网络编程相关章节
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP