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

标签 c++ sockets ibm-midrange

这是在 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/

相关文章:

c++ - 微雪电子纸ESP32板HTTP客户端管理问题

c++ - 取消/清除 boost::tuple of pointers

c++ - 如何在卡萨布兰卡(CPP Rest SDK)中为客户提供特定的 IP 地址

c - 如何在 IBM i-series (AS/400) 上查找对应于 CHGJOB INQMSGRPY(*DFT) 的 ILE C 函数

java - 列名称中包含 "é"的 iSeries JDBC Sql 语句抛出 java.sql.SQLException : [SQL0104]

c++ - 自定义 C++ 扩展错误 : pasting “pybind11_init_” and “‘sigmoid’ ” does not give a valid preprocessing token

java - handshake.getPeerCertificates() 双向握手中的空指针

php - 无法在kali linux上配置LAMP

ibm-midrange - 如何在 RPGLE 中获取角色的 EBCDIC 值?

c++ - 如何将 freetype2.6 库添加到 code::blocks