gpt4 book ai didi

c - 客户端如何在用 C 语言编写的 TCP 服务器上故意触发接受错误?

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

考虑以下用 C 编写的 TCP 服务器的实现:

struct sockaddr_in client;
int server_fd = socket(AF_INET, SOCK_STREAM, 0);

// bind, listen, error handling, etc.

while(1) {
int client_fd = accept(server_fd,
(struct sockaddr *) &client,
&client_len);
if (client_fd < 0) {
exit(1);
}

// do something with client_fd

close(client_fd);
}
客户端是否有可能通过发送数据包故意使服务器崩溃,例如 accept调用失败(返回小于零的值)?
手册页(Debian 10)列出了如下错误,但我不确定客户端是否能够触发其中任何一个:

  • In addition, network errors for the new socket and as defined for the protocol may be returned.Various Linux kernels can return other errors such as ENOSR, ESOCKTNOSUPPORT, EPROTONOSUPPORT,ETIMEDOUT. The value ERESTARTSYS may be seen during a trace.



  • EPROTO Protocol error.



  • 我已经尝试了一些相当简单的事情,比如立即断开客户端套接字。解决这个问题的下一步是手动制作一些数据包,使用 RAW 套接字或像 Scapy 这样的工具。然后试图找到触发协议(protocol)错误的方法。
    我找不到这方面的任何信息,所以我的问题是是否有可能故意这样做,或者我是否可以停止尝试。

    最佳答案

    accept()有很多方法失败,并且它们在操作系统和套接字实现之间没有完全标准化。
    仅仅因为一个 accept() 就终止你的服务器不是一个好主意。通话失败。最好记录一个错误并等待下一个传入连接。一些错误,例如 EINVAL , EFAULTENOTSOCK在您给出的示例中可能被认为是不可恢复的,因此如果它得到其中之一,您可以让服务器退出,但在您的应用程序堆栈的更大上下文中应该仔细考虑它(例如,如果有一个将重新启动的看门狗服务器自动)。

    关于c - 客户端如何在用 C 语言编写的 TCP 服务器上故意触发接受错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62724430/

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