socket()和bind()的行为如何?

时间:2012-09-24 03:54:41

标签: c++ linux sockets network-programming

我对C ++套接字编程有一些疑问。如果我问的方式错了,请帮助深挖,并帮助纠正。

  1. 操作系统级别每个端口是否有一个文件描述符。
  2. 多个端口如何使用相同的网络接口?是换成了吗? 处理器中的线程?所以,如果使用端口的数量增加,可以 特定港口的延迟数据?
  3. 创建套接字时OS级别会发生什么?是否创建对IO文件描述符的任何引用?
  4. 然后调用bind()时OS级别会发生什么。它如何互连套接字和网卡地址?
  5. 使用可重复使用的插座时会发生什么?多个套接字如何绑定到一个端口?像线程那样切换一个端口?
  6. 在没有bind()的情况下发送或接收特定地址或端口? 操作系统如何以及选择地址和端口是什么。

3 个答案:

答案 0 :(得分:3)

你很难找到比插座的“圣经”更有影响力的网络编程文本,W Richard Stevens:Unix Network Programming。套接字编程不是一夜之间就会出现的,所以不要指望它。这是一门简单明了的学科。并且,像所有学科一样,它需要磨练。

答案 1 :(得分:2)

  

OS级别的每个端口是否有一个文件描述符。

没有。如果您是服务器接受侦听套接字上的连接,则可能有10,000个文件描述符都引用相同的本地端口号。

  

多个端口如何使用相同的网络接口?它是否像处理器中的线程一样切换?那么,如果使用端口的数量增加,是否可以延迟特定端口的数据?

在这里回答太复杂了。

  

创建套接字时OS级别会发生什么?是否创建对IO文件描述符的任何引用?

它们是非常相似的东西,在某些操作系统中它们甚至是相同的东西。一个引用套接字,另一个引用打开文件。

  

然后在调用bind()时OS级别会发生什么。

端口和IP地址分配给套接字。 IP地址可以是0.0.0.0。如果指定的端口为零,系统将从空闲端口为您选择一个。

  

它如何互连套接字和网卡地址?

见上文。

  

使用可重复使用的套接字会发生什么?

没有“可重复使用的套接字”这样的东西。你在谈论重用端口吗?

  

在没有bind()的情况下发送或接收特定地址或端口?操作系统如何以及选择地址和端口是什么。

如果您尚未自己执行bind(),则会在幕后执行bind()。因此,相同的规则适用于{{1}},如上所述。

答案 2 :(得分:0)

我认为您应该阅读套接字编程,您要问的是基本概念,您应该了解服务器,客户端,TCP,UDP,本地主机,远程主机等术语。 socket()在进程和传输层之间创建一个接口,它创建并告诉套接字的特性。 bind()将套接字绑定到您的本地地址。 你可以查看手册页1或2,你会找到一个全面的答案。