套接字描述符是唯一的吗? [复制]
Posted
技术标签:
【中文标题】套接字描述符是唯一的吗? [复制]【英文标题】:Are socket descriptor unique? [duplicate] 【发布时间】:2015-03-17 20:29:30 【问题描述】:socket() 函数返回的 C 套接字描述符是否唯一? 我同时从两个程序调用它,我得到了相同的输出
(socDes = socket(PF_INET, SOCK_MRP, 0)
printf("%d",socDes);
根据其手册页,socket() 返回一个新套接字的文件描述符
如果两个程序具有相同的套接字,接收到的数据包如何转移到不同的进程?任何详细说明都会有所帮助。
【问题讨论】:
你的意思是同一个socket?因为文件描述符是相同的数字? 文件/套接字描述符基本上是进程内存空间中某处的数组条目。两个进程可能都有一个 #42 的套接字/文件 desc,但它们是两个单独数组中的两个条目,否则彼此没有关系。 【参考方案1】:套接字描述符是文件系统句柄,在会话期间对于您的进程应该是唯一的。但如果你结束并重新运行,你很可能会收到相同的值。
请记住,每个进程都有自己的文件系统句柄列表。所以进程 10 中的文件描述符 3 可能与进程 20 中的文件描述符 3 非常不同。
【讨论】:
这意味着如果我创建多个套接字,它们引用同一个文件? 没有。每个套接字都是同一进程中的唯一端点。进程看不到彼此的描述符,除非一个是 fork() 的子进程,并且父进程决定允许它对子进程可见。【参考方案2】:文件描述符是一种进程资源。系统中加载的每个程序都有自己独立的文件描述符集。这就是为什么STDOUT
/STDIN
对应于FD 1/2(或者是0/1?)。实际上,文件描述符是操作系统持有的资源的数字标识符,它们恰好可以作为整数打印(不能保证在所有系统上都可以,您看到的是实现细节)。在操作系统中,您的 FD 1、2、3 等对应的资源与其他进程不同。
由于每个进程都有自己的资源池,因此文件描述符将位于不同的池中。由于操作系统如何分配这些 ID,它们恰好具有相同的 ID!
【讨论】:
仅供参考:标准输入 = 0,标准输出 = 1,标准错误 = 2。以上是关于套接字描述符是唯一的吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
linux tcp socket并发编程,调用accept函数后调用fork。两台电脑测试,为何accept返回的描述符是相同的?