当前位置: 首页 > 知识库问答 >
问题:

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

赵星华
2023-03-14

这是在AS400(IBMi、iSeries等)上。

我有一个小Java程序,用来将测试文件发送到用C语言编写的服务器,该服务器也在IBMi上运行。在我的Java程序中,我将响应的超时设置为5。在服务器中,我随机Hibernate0到10秒。当Java程序超时时,它会抛出java.net.SocketTimeoutException,用关闭()关闭套接字并退出。服务器程序在Hibernate后继续运行,并调用发送()。问题是,发送()不会以-1失败,并给出ENOTCONN。为什么?套接字上的inet_ntop()也给了我连接到服务器的远程IP和端口,就好像套接字仍然连接着一样。挠我的头。

编辑:在对民意测验()失望之后,我发现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个答案

上官淮晨
2023-03-14

从人发送:

埃诺康公司

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

换句话说,你的期望是不正确的。ENOTCONN适用于没有连接插座的情况。这与对等体断开连接没有任何关系。这种情况最终会导致ECONNRESET,但不是在第一次发送时,因为TCP缓冲。

设计工作。

 类似资料:
  • socket.io 0.9 node.js 0.10.15 速递3.3.4 即:调用 --服务器端 --客户端

  • 问题内容: 如何关闭客户端的套接字连接? 我在用: socket.io 0.9 node.js 0.10.15 express3.3.4 即:呼叫 -服务器端 - 客户端 如果加载测试页,则需要来自服务器的一些值(getInitData)。 在第一页上,我获取一次数据,在重新加载或第二遍上,我获取两次数据,依此类推。 重新加载页面以及离开页面后,服务器端的连接将自动关闭。 但是在客户端,连接仍然打

  • 我刚刚开始使用hazelcast[3.3.1]。根据hazelcast应用程序和客户端教程,我创建了一个hazelcast应用程序实例和一个客户端(使用eclipse IDE)。 从客户端,我能够将对象添加到地图并成功获取它们。但是,我在实例的控制台上看到以下警告,它们似乎警告客户端断开连接。这是每个客户端get/put的正常行为吗? 在退出客户端程序之前,是否有适当的方法断开客户端与实例的连接?

  • 问题内容: 我应该在哪里关闭与Elasticsearch客户端的连接?我正在使用Spring,并且我不想使用Elasticsearch集成,因为我想学习如何首先完成它。应该只为该应用程序创建一个客户端吗?意味着它将具有单例范围?还是应该具有原型范围并为每次交互关闭连接? 问题答案: 您应该为每个应用程序使用一个客户端,使其成为单例并在应用程序关闭时关闭。

  • 我有一个servlet,它以XML格式响应。 客户端通过HttpSurlConnection连接到这个servlet。现在,如果客户端不调用会有问题吗? 非常感谢。

  • 故事是这样的,我有一个远程服务器和一个防火墙后面的客户端。客户端由netty实现,它将建立一个与远程服务器的保活连接。如果200秒内通道中没有消息传输,防火墙将重置连接到远程服务器端的连接,但客户端没有收到任何tcp数据包(例如RST包),因此客户端认为此连接是活的,而事实并非如此。那么如何在防火墙错误处理此保活连接之前强制关闭不寻常的连接呢?顺便说一句:我无法配置防火墙