【问题标题】:What does it mean that accept() creates a new socket?accept() 创建一个新的套接字是什么意思?
【发布时间】:2018-11-17 11:49:46
【问题描述】:

我的问题是基于以下理解

  • 套接字由 ip:port 定义。服务器和客户端都有自己的套接字
  • Socket 连接由五个 touples server_ip、server_port、client_ip、client_port、protocol 定义
  • 套接字描述符是一个标识套接字的整数值

我尝试实现自己的服务器,其中 socket() 和 accept() 返回不同的套接字描述符值(总是这样吗?)。我的问题是为什么说如果在服务器中没有打开新端口并且 ip:port 对于 socket() 和 accept() 返回的套接字描述符都相同,accept() 会创建一个新套接字。如果新的socket是由accept()创建的,它与socket()创建的socket有什么不同?

【问题讨论】:

  • "Socket 连接由...定义" - 在大多数网络中,连接通常是 4 元组 {server_ip, server_port, client_ip, client_port},因为 TCP/ IP 通常是隐含的。或者,TCP/IP 连接可能是 4 元组。
  • @jww protocol 也包含在识别唯一连接中,因为多个协议可以同时在同一个 IP:port 上运行。例如,TCP 和 UDP,在某些情况下,甚至是 IPv4 和 IPv6。

标签: linux sockets network-programming client-server


【解决方案1】:
  1. 我尝试实现我自己的服务器,socket()accept() 返回 不同的套接字描述符值(总是这样吗?)。

是的。

  1. 我的问题是为什么说accept() 如果没有则创建一个新套接字 在服务器中打开了新端口,并且两个套接字的 ip:port 相同 socket()accept() 返回的描述符。如果新的插座是 由accept() 创建的它与由accept() 创建的套接字有何不同 socket()?

因为第一个套接字用于等待通信,而第二个用于通信。调用socket (+bind+listen) 准备一个通信端点,也就是socket(或server socket)来接收来电。在准备充分的通信点上调用accept,等待传入调用,当这种情况发生时,会创建一个通信通道(2 个端点 + 协议),由返回的 连接的套接字 表示来电。

C API 可能会让您感到困惑,因为两者都称为套接字,但实际上用途不同。在其他一些语言/API 中进行了区分。例如,在 Java 中,ServerSocket 用于等待来电,Socket 用于通信。

【讨论】:

  • 肯定通过区分socket和connected socket事情变得容易理解了。在接受您的回答之前,让我们等着看其他人是否有话要说。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多