gpt4 book ai didi

sockets - 一端的套接字上的close()是否也会在另一端关闭吗?

转载 作者:行者123 更新时间:2023-12-03 12:02:03 25 4
gpt4 key购买 nike

如果已建立套接字(通过connect()从客户端连接后),则退出并因此内核关闭了所有打开的文件描述符,另一端又会怎样呢?如果客户端发送FIN并由服务器对其进行确认(这是半关闭状态),但是服务器尝试在该套接字上使用read(),那么会发生什么呢?我可以想象2种情况:

  • 套接字服务器read()开启,也已关闭。但是在服务器端没有exit(),因此没有人在该端关闭该套接字。所以在这里我不知道服务器如何结束,因为不应关闭该套接字的末端
  • 服务器关闭的
  • 没有关闭,但它读取0个字节。 (read()的返回值就是0),其余内容保留在设计器中如何处理读取的返回值。但是,即使服务器端套接字没有关闭,服务器何时也要发送其FIN位?完成执行后(完成完整的连接终止)?

  • 这是服务器端从关闭的套接字读取的语句(在客户端关闭):
    while ((len = read(sockfd, buf, 256)) > 0){
    ...
    }
    在这里,会因为 read()读取封闭的 sockfd而返回吗?还是因为 read()返回0从而错误了条件? (上述2种情况)。据我所知,如果 read()将在封闭的fd上读取,则错误将返回(-1)。但是0字节的读取只是返回(0)。那么返回了什么呢?

    最佳答案

    连接的关闭意味着两个对等点都同意他们不想再进行任何通信。如果只有一个对等方关闭套接字,则它仅与FIN通信,它将不再发送任何数据。它还会向本地OS传达它不再愿意接收任何数据的信息-此处close(sock)shutdown(sock,SHUT_WR)不同。
    如果客户端关闭或关闭套接字,对服务器中read的调用将返回0,因为这意味着不再有数据从客户端发送到服务器。然后,服务器可能决定也关闭或关闭套接字。但由于套接字尚未在服务器中关闭,因此可能还会决定向客户端发送更多数据。如果服务器发送更多数据,则客户端将以RST(连接重置)进行响应,因为它不希望收到更多数据。收到RST时,服务器端套接字也会自动关闭。

    while ((len = read(sockfd, buf, 256)) > 0){

    在大多数情况下,如果客户端已关闭连接, read将在此处返回0。万一套接字发生错误(特别是连接重置),它将返回-1。如果在客户端已经关闭连接的同时服务器已向客户端写入数据(即竞争条件),则可能会发生这种情况,在这种情况下,客户端将返回RST。该错误将在套接字上的下一个系统调用中传递,即 read

    关于sockets - 一端的套接字上的close()是否也会在另一端关闭吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65534414/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com