当前位置: 首页 > 知识库问答 >
问题:

当服务器套接字接受客户端套接字时,到底发生了什么事情?

黄隐水
2023-03-14

我正在学习套接字编程,服务器套接字accept()让我感到困惑。我为服务器套接字accept()写了两个场景,请看一下:

    null

如果我的一个假设是正确的,那会回答下面的问题吗?或者,我的两种设想都是错误的。如果你能指导我找到正确的答案,或者至少是一些相关的文本来学习,我将非常感谢。

共有1个答案

麹鸿煊
2023-03-14

当您创建一个套接字并在该套接字上执行绑定,然后执行侦听时,您所拥有的就是所谓的侦听套接字。当建立连接时,这个套接字基本上被克隆到一个新的套接字,这个套接字被称为服务套接字它绑定到的端口仍然与原始端口相同。

但是这个套接字和以前的监听套接字有一个重要的区别。即它是套接字对的一部分。唯一标识连接的是套接字对。因此,由于在图片中有2个套接字对,所以TCP通信通道的两端有2个IP Address和2个端口。在克隆服务套接字期间,TCP内核将分配一个tcb,并在其中存储这2个ip@和2个端口。TCB还包含属于TCB的套接字编号。

每次TCP段进入时,都会检查TCP报头,检查它是否是SYN,对于SYN,您需要建立连接,这样您就已经通过了,但随后内核会检查它的监听套接字列表。如果它是一个普通的TCP数据包,而不是SYN,则两个端口号都在TCP报头中,IP@是IP报头的一部分,因此内核能够使用此信息找到属于此TCP连接的TCP。(对于SYN,该信息也存在,但正如我所说的,对于SYN,您只需要处理监听套接字)

这就是它的工作原理。

这些信息可以在UNIX网络编程:套接字网络API中找到。其中描述了到套接字的链接,而在其他参考资料中通常没有详细描述,而是强调了TCP的基本原理。

 类似资料:
  • 假设通过网络在两个套接字之间建立tcp连接。一个是服务器端,另一个是客户端。 谢谢

  • 我试图用java实现一个客户端服务器,在这里我读取客户端中的输入并在服务器中执行UperCase,然后返回客户端并打印UperCase。我使用ObjectOutputStream和ObjectInputStream进行读写,但是当我在客户机中键入一个msg时,程序会显示以下错误: Digite uma msg casa java.io.eofexception位于java.io.datainput

  • 当我尝试使用套接字将物理设备连接到服务器时,我遇到了一个问题。在服务器端,它似乎不接受任何连接,而在客户端,套接字超时。你知道为什么会这样吗? 我在下面提供我的代码 服务器代码: 客户端: 11-16 23:32:11.016:W/系统。错误(24213):java.net。ConnectException:无法连接到/192.168.1.116(端口9090):连接失败:ETIMEDOUT(连接

  • 首先我要感谢你花时间... 我在macbook中用C++创建了一个服务器套接字,在运行windows XP的不同机器中用Java创建了一个客户机/套接字。我已将端口指定为5000,但无法指定正确的主机,因此无法进行连接。当我在windows xp中使用WinSock2创建一个C++服务器/套接字时,当我使用本地主机时,连接是完美的...有什么想法吗??? 提前Thnx int main(int a

  • 我正试图从套接字服务器(Java)向套接字客户端(Python)发送一个映像,但客户端中接收到的映像大小不正确,无法打开。我不知道我做错了什么。有什么建议吗?

  • 真的需要你帮忙。 我的项目是通过电缆连接两台PC机,并使用tcp套接字将客户端文本框形式的字符串发送到服务器。问题是ATI只能发送一个字符串,然后连接就会关闭。 注意:某个端口上的连接将在表单加载中建立并成功。