如何在连接/发送中设置超时? (AS400 ISERIES V5R4,RPG)
-
29-09-2019 - |
题
由此 RPG插座教程 我们在RPG中创建了一个插座客户端,该客户端调用Java服务器套接字
问题是Connect()/send()操作块,我们需要一个要求,如果连接/发送无法在每秒钟内完成,我们必须只登录它并完成。
如果我将插座设置为非阻滞模式(我认为使用FNCTL),我们将无法完全了解如何进行,也找不到任何有用的文档,其中包含示例。
我认为,如果我确实连接到一个非阻滞套接字,则必须选择(...,超时),这告诉我们连接是否成功,并且/我们可以发送(字节)。但是,如果之后我们发送(字节),因为它现在是一个非阻止插座(将在通话后立即返回),我如何知道send()在关闭之前将字节发送到服务器的实际发送()插座 ?
我可以倒退以将AS400的客户端套接字作为Java或C过程,但我真的只想将其保留在简单的RPG程序中。
有人会帮助我了解该怎么做吗?谢谢 !
解决方案
我认为,您提到的RPG教程有一个轻微的缺陷。我认为引起您的困惑的是以下 部分 代码:
...
因此,我们通常会以这样的方式调用send()API:D miscdata S 25A D rc S 10I 0 C eval miscdata = 'The data to send goes here' C eval rc = send(s: %addr(miscdata): 25: 0) c if rc < 25 C* for some reason we weren't able to send all 25 bytes! C endif
...
如果您阅读了文档 send()
您会看到,如果返回值大于-1,则在上面的代码中似乎发生了错误,则不会表示错误。实际上,假设您将指针移动到缓冲区以反映已发送的内容,则返回值的总和必须等于缓冲区的大小。看 这里 在 Beej的网络编程指南. 。您可能还想看理查德·史蒂文斯(Richard Stevens)的书 UNIX网络编程,第1卷 有关真正详细的解释。
至于确定最后一个发送之前的问题 close()
实际发送...好吧,上面的段落说明了如何确定已发送数据的哪些部分。但是,打电话 close()
除非 SO_LINGER
设置。
fnctl()
用于控制阻塞 setsockopt()
用于设置 SO_LINGER
.
使用网络通信的抽象是BSD插座。 OS的实施情况有一些略有差异,但通常是均匀的。这意味着通常可以使用为其他操作系统编写的文档作为广泛概述。 大多数时候.