为什么端口不能保持开放状态?

时间:2019-10-09 16:47:36

标签: c

故事:我开了一家公司,这里有Door 91,允许客户进来:listen(Path_to_Me, 5);。如果有客户进来,我会在Me_and_Them = accept(Path_to_Me, (struct sockaddr *) &Their_Address, &sin_len);中接受他们,然后打印他们的地址:printf("Their Address : [%s]\n", inet_ntoa(Their_Address.sin_addr));然后向客户写一条消息:write(Me_and_Them, response, sizeof(response) - 1);,然后关门大吉:close(Me_and_Them);,以便关闭我与客户之间的联系。

问题:为什么必须关闭我的生意门才能关闭我和我的客户之间的联系?为什么客户不能简单地从门上走开,让其他可能的顾客继续进门呢?

int main() {

    int one = 1;
    struct sockaddr_in My_Address, Their_Address;
    socklen_t sin_len = sizeof(Their_Address);

    int Path_to_Me = socket(AF_INET, SOCK_STREAM, 0);

    setsockopt(Path_to_Me, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int));

    int Door = 91;

    My_Address.sin_family = AF_INET;
    My_Address.sin_addr.s_addr = INADDR_ANY;
    My_Address.sin_port = htons(Door);

    bind(Path_to_Me, (struct sockaddr *) &My_Address, sizeof(My_Address));

    listen(Path_to_Me, 5);

    int Me_and_Them;

    Me_and_Them = accept(Path_to_Me, (struct sockaddr *) &Their_Address, &sin_len);
    printf("Their Address : [%s]\n", inet_ntoa(Their_Address.sin_addr));

    char response[] = "test\n";
    write(Me_and_Them, response, sizeof(response) - 1);
    close(Me_and_Them);

return 0;
}

1 个答案:

答案 0 :(得分:1)

通常有充分的理由避免使用现实生活与软件内部工作或任何技术相关的类比:有充分的理由:当您从表面上看它们时,它们看起来似乎很诱人,但它们会以各种可怕的方式分解,例如一旦您潜入比水面深一点的地方。而且,它们如此危险,甚至在表面上也根本没有帮助:为保持类比而必须进行的心理内务处理就好像为当前问题的复杂性增加了一个维度。因此,我的建议是:忘记现实生活中的类比,从技术上和仅技术上进行思考。

之所以存在“连接”的概念,是因为基础系统(Internet协议栈)出于管理目的需要它。在“连接”中,系统保留各种信息,例如远程方的IP地址,缓冲区,缓冲区将在其中从远程方接收数据,直到完成整个数据包为止,以便随后将数据包作为一个整体传递给您。片,错误纠正信息,例如数据包ID,以便堆栈知道它是否丢失了数据包或正在接收重复的数据包,等等。

所有这些信息都是至关重要的,并且仅涉及与该特定远程方的通信。当另一方进入时,他们将具有不同的IP地址,您不希望他们的数据与前一个人的数据混合,并且您想要一个新的数据包序列以进行纠错。换句话说,您需要一个新的连接。这就是连接的全部内容,这就是为什么必须与每个远程方建立不同的连接的原因。