这是在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;
}
}
答案 0 :(得分:2)
从 man发送:
ENOTCONN
套接字没有连接,也没有给出目标。
换句话说,您的期望是错误的。 ENOTCONN适用于您未连接套接字的情况。它与对等断开连接没有任何关系。由于TCP缓冲,这种情况最终将导致ECONNRESET,但不会导致第一次这样的发送。
按设计工作。