免费注册 查看新帖 |

Chinaunix

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

一个关于socket的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-11 16:34 |只看该作者 |倒序浏览
目前我在一个系统中跑两个协议栈,一个是IPv4的一个是IPv6的,那我分别调用不通的API分别创建一个套接字一个是ipv4的一个是ipv6的,它们会发生冲突嘛? 因为是各自的协议栈,各自去分配fd号,这个fd号有可能是一样的,比如ipv4分配的是4,ipv6分配的也是4,那么到时候调用receive或者send或者select的时候会不会混淆呢?

论坛徽章:
0
2 [报告]
发表于 2010-05-11 16:37 |只看该作者
如果是同一个进程,fd肯定不一样

论坛徽章:
0
3 [报告]
发表于 2010-05-11 16:41 |只看该作者
本帖最后由 ConquerorLiu 于 2010-05-11 16:47 编辑

回复 2# lmarsin


   那假如一个进程跑的是ipv4的应用程序,一个进程跑的是ipv6的应用程序,那在此种情况之下fd是有可能会冲突的把?

关键的一点是协议栈都是不同的啊,而不是说同一个协议栈支持双协议。
A协议栈跑ipv4
B协议栈跑ipv6
然后在它们之上做一个适配层,所做的工作就是上层调用的时候还是类似于BSD的方式去调用,但是下层则是调用的不同协议栈的API。
这样的做法的一个担忧就是各自协议栈所创建的fd是否会有冲突的风险?

论坛徽章:
0
4 [报告]
发表于 2010-05-11 16:47 |只看该作者
回复 3# ConquerorLiu


    socket ()出来的文件不会冲突

论坛徽章:
0
5 [报告]
发表于 2010-05-11 16:55 |只看该作者
回复 4# lmarsin


    为何呢?能否做一个详细点的解释呢,两个协议栈都调用socket去创建fd。每一个协议栈都是从3开始去分配fd的呢

论坛徽章:
0
6 [报告]
发表于 2010-05-11 16:58 |只看该作者
fd是属于进程的,与fd关联的套接口文件,每次都是new出来的,因此尽管fd号一样,但对应的套接口文件是不同的

论坛徽章:
0
7 [报告]
发表于 2010-05-11 17:00 |只看该作者
fd是文件系统的概念,借用到协议栈而已。简单的说,打开一个普通文件的fd,如果和ipv4的socket的fd一样,那你说:
read(fd ...);
怎么办?这个fd到底是什么东东?
显然一个fd在一个进程里面是全局的,和协议栈之类的没有关系。
如果是两个进程,fd一样,那也没有关系。

论坛徽章:
0
8 [报告]
发表于 2010-05-11 17:10 |只看该作者
那我select监听的时候,是监听所有的fd对吧,那这样如果某个fd上有了读或者写的动作,那么这个fd是属于v4还是v6呢?

fd是属于进程的,与fd关联的套接口文件,每次都是new出来的,因此尽管fd号一样,但对应的套接口文件是不同的 ...
lmarsin 发表于 2010-05-11 16:58

论坛徽章:
0
9 [报告]
发表于 2010-05-11 17:12 |只看该作者
回复 8# ConquerorLiu


    取决于你socket()时用IPv4还是IPv6

论坛徽章:
0
10 [报告]
发表于 2010-05-11 17:14 |只看该作者
select监听,只监听需要监听的,不是所有的。fd不可能重复,每个fd都有个“描述块”,里面存了相关信息。是属于v4还是v6,根据这里面的信息就知道了。这么有兴趣,就看看操作系统相关的资料吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP