gpt4 book ai didi

c++ - 当客户端关闭连接时 send() 不报告 ENOTCONN (AS400)

转载 作者:行者123 更新时间:2023-11-28 01:54:52 27 4
gpt4 key购买 nike

这是在 AS400(IBM i、iSeries 等)上。

我有一个小型 Java 程序,用于将测试文件发送到用 C++ 编写的服务器,该服务器也在 IBM i 上运行。在我的 Java 程序中,我将响应超时设置为 5,比方说。在服务器中,我随机休眠 0 到 10 秒。当Java程序超时时,它抛出java.net.SocketTimeoutException,用.close()关闭socket并退出。服务器程序在其休眠后继续运行并调用 send()。事实是,send() 不会因 -1 而失败并给出 ENOTCONN。为什么?套接字上的 inet_ntop() 也为我提供了连接到服务器的远程 IP 和端口,就好像套接字仍处于连接状态一样。挠我的头。

编辑:在对 poll() 感到失望之后,我发现 select() 在设置错误集时会使用 FD_ISSET() 报告错误。在我的例子中,select() 返回 3,表示为我的一个套接字设置了 3 个条件(读、写和错误)。你无法找出错误是什么,至少我还不知道如何找出错误。

fd_set read_set, write_set, error_set;
FD_ZERO(&read_set);
FD_ZERO(&write_set);
FD_ZERO(&error_set);
FD_SET(sock_fd, &read_set);
FD_SET(sock_fd, &write_set);
FD_SET(sock_fd, &error_set);
struct timeval timeout;
timeout.tv_sec = 10; // reset this on every new iteration.
timeout.tv_usec = 0;
int rc = select(sock_fd + 1, &read_set, &write_set, &error_set, &timeout);
CERR << "select() returned " << rc << endl;
if (rc >= 0) {
if (FD_ISSET(sock_fd, &read_set)) {
CERR << "ready to read" << endl;
}
if (FD_ISSET(sock_fd, &write_set)) {
CERR << "ready to write" << endl;
}
if (FD_ISSET(sock_fd, &error_set)) {
CERR << "has an error" << endl;
CERR << "errno=" << errno << ", " << strerror(errno) << endl;
}
}

最佳答案

来自 man send:

ENOTCONN

The socket is not connected, and no target has been given.

换句话说,您的期望是不正确的。 ENOTCONN 适用于 尚未连接套接字 的情况。它与对等断开连接没有任何关系。由于 TCP 缓冲,这种情况最终会导致 ECONNRESET,但不会在第一次此类发送时发生。

按设计工作。

关于c++ - 当客户端关闭连接时 send() 不报告 ENOTCONN (AS400),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41557855/

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