【问题标题】:What is FIONBIO value for iOS, to Block/Unblock Sockets?iOS 的 FIONBIO 值是什么,以阻止/取消阻止套接字?
【发布时间】:2019-10-30 04:17:23
【问题描述】:

我一直在使用基于Indy TIdHTTP组件的跨平台Websocket客户端,发现here

客户端,TIdHTTPWebSocketClient,内部使用TIdWebSocketMultiReadThread;后者通过使用 Indy 的 GStack IOControl 访问 ioctl 来创建非阻塞套接字(InitSpecialEventSocket 方法)。

从github下载的代码适用于Windows,但在Android上失败; FIONBIO 必须改成$5421

我目前无法在 iOS 上进行测试,想知道其他人是否设法让 TIdHTTPWebSocketClient 在这个平台上工作,以及应该使用 FIONBIO 的什么值。

提前致谢。

【问题讨论】:

    标签: ios delphi websocket cross-platform indy


    【解决方案1】:

    FIONBIO 适用于 Windows 上的 ioctlsocket() 和 POSIX 上的 ioctl()

    在 POSIX 上,您可以选择在创建套接字时指定 SOCK_NONBLOCK 标志,或使用 fcntl(F_SETFL) 在套接字上设置 O_NONBLOCK 标志。

    请注意,Indy 在 TIdStack.NewSocketHandle()TIdStackBSDBase.WSSocket() 方法上确实有一个 AOverlapped(非阻塞)参数,以及一个 TIdStackBSDBase.SetBlocking() 方法,但它们目前还没有为非 Windows 平台实现(代码有已为他们编写,但尚未签入)。

    【讨论】:

    • 嗨,雷米,感谢您的回复。我想尝试 SOCK_NONBLOCK,但在 Source 目录中的任何地方都找不到它定义。我在网上找到了 04000 美元的值,并尝试了:Posix.SysSocket.socket (IdIPFamily[Id_IPv4], Id_SOCK_STREAM 或 SOCK_NONBLOCK , Id_IPPROTO_IP),但返回 -1。你能告诉我 SOCK_NONBLOCK 的值是什么,或者在哪里可以找到它?再次感谢。
    • @CAnder 我见过SOCK_NONBLOCK 定义为04000 (here too)、0x400000000x800,但没有0x04000
    • 嗨 Remy,诚然,我找到的值也是 04000;我自己在值之前加上了'$',所以很抱歉。顺便说一句,设法让 fcntl 选项起作用,再次感谢。
    • @CAnder 从技术上讲,C++ 中的 04000 是八进制文字,而不是十进制文字。 04000 八进制 = 2048 十进制 = 0x800 十六进制。 Delphi does not support octal literals.
    • 嗨 Remy,使用 800 美元作为 SOCK_NONBLOCK 工作,加上我以前不知道八进制文字,所以也谢谢你。我决定坚持使用 fcntl,因为在 Delphi 中为 Android 和 OSX 都明确定义了 O_NONBLOCK。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多