由此 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的实施情况有一些略有差异,但通常是均匀的。这意味着通常可以使用为其他操作系统编写的文档作为广泛概述。 大多数时候.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top