客户端关闭连接时,send()不报告ENOTCONN(AS400)

时间:2017-01-09 22:13:46

标签: c++ sockets ibm-midrange

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

我有一个小型Java程序,用于将测试文件发送到用C ++编写的服务器,该服务器也可以在IBM i上运行。在我的Java程序中,我将响应的超时设置为5,让我们说。在服务器中,我随机睡了0到10秒。当Java程序超时时,它抛出java.net.SocketTimeoutException,用.close()关闭套接字并退出。服务器程序在睡眠后继续运行并调用send()。事实是,send()不会失败,并给出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;
    }
}

1 个答案:

答案 0 :(得分:2)

man发送

  

ENOTCONN

     

套接字没有连接,也没有给出目标。

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

按设计工作。