问题标签 [cocoaasyncsocket]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
4364 浏览

ios - 从 UDP 服务器消息中检索字符串

我在基于 Swift 的 iOS 应用程序中使用CocoaAsyncSocket库。我已经为我网络上的 UDP 服务器创建了一个异步 UDP 套接字,它会发回一个回复。

我正在阅读这样的回复:

这是结果:

如您所见,这是一堆奇怪的字符。

原始数据是<100277fe c0a80172 00000000 00000000>(通过写入println(data))。这里的前 4 个字节似乎是wþÀ¨r部分,接下来的 4 个字节是我已经从getHost()函数中检索到的 IP 地址。

我似乎找不到任何帮助函数来提取 UDP 服务器接收到的实际数据。我知道 UDP 回复的 ASCII 表示是“你好”。但是,如果我将其更改为其他内容,它不会反映在我在 Xcode 调试部分中看到的数据中。它总是 wþÀ¨r

我已经尝试过使用NSASCIIStringEncodingand NSUTF8StringEncoding,但后者会导致EXC_BAD_ACCESS运行时异常。

据我所知,这是人们通常在 Objective-C 中(在didReceiveData函数内部)执行此操作的方式:

如何在 UDP 回复中以字符串表示形式找到“hello”消息?

0 投票
0 回答
498 浏览

ios - iO 上的 UDP 包丢失率非常高(GCDAsyncUdpSockets)

我正在开发一个用于控制物理硬件的 iPhone 应用程序。
例程如下:

  • 应用程序在广播通道上的端口 8089 上发送一个特定的 8 字节“唤醒”数据报;消息被重复发送。
  • 侦听端口 8089 的外部硬件接收消息并发送一个 94 字节的数据报,其中包含硬件的 IP 和 MAC 地址等;这也在广播频道上。
  • 应用程序停止发送“唤醒”消息,存储 IP,并开始通过 TCP 套接字与硬件通信

该例程通常有效。但是,我经常在接收时莫名其妙地丢失 UDP 包;也就是说,我发送了 8 字节的“唤醒”信号,但没有得到 94 字节的响应。当应用程序运行时,它运行良好:我几乎不会丢失一个包,如果应用程序错过了第一个 94 字节的消息,它会得到第二个或第三个。当它不起作用时,它会不断地丢失所有包。“不工作”阶段可能会持续几分钟或几小时;我没有发现明显的触发因素 - 就好像在某个阶段,无缘无故地,接收停止工作。

在这里问之前,我已经做了非常广泛的调试。我已经通过 rvictl 和 tcpdump 监控了套接字,并确认我的日志反映了套接字级别发生的情况。为了将外部硬件排除在外,我构建了一个镜像应用程序,其行为与硬件一样。我尝试过更改端口,尝试关闭和关闭套接字,重置它们,暂停和重新启动接收。这些都不起作用。

我用 GCDAsyncUdpSocket 开发了我的通信库。为了安全起见,我也尝试过非 GCD 版本;结果是一样的。我围绕 C 套接字构建了自己的最小包装器;我有同样的行为。

这是我的实现代码:

你有什么建议吗?
有没有办法确保套接字接收永远不会停止?

在此先感谢,
戴维德

0 投票
0 回答
68 浏览

cocoaasyncsocket - 使用 CocoaAsyncSocket 的 GCDAsyncSocket 读取未终止的数据

我正在尝试创建一个应用程序,该应用程序打开一个侦听 TCP 套接字,然后读取写入套接字的所有字节,然后对这些字节执行一些操作。服务器不知道将写入套接字的数据的长度。此外,发送的数据中没有终止字符。我想做的只是读取所有可用字节,延迟一小会儿,然后尝试读取更多字节等。有没有简单的方法可以做到这一点?我只想在超时或 1 秒内读取 100 个字节,然后如果读取超时,则获取所有可用数据,然后再次开始读取。

0 投票
2 回答
21915 浏览

ios - Swift:使用 GCDAsyncUdpSocket 接收 UDP

背景:

我希望能够在我的 iOS 应用程序和服务器之间发送和接收 UDP 数据包。服务器将每条传入消息回显给客户端应用程序。服务器经过测试并确认工作正常。我有一个 StartViewController,它启动两个实现 GCDAsyncUdpSocketDelegate 的类,一个用于发送,一个用于接收。“发送套接字”正在工作,服务器接收消息。

问题:

该应用程序在发送后永远不会收到传入的消息。由于 didReceiveData 从未被调用,因此侦听套接字设置可能是错误的。

我做错了吗?

开始:

收到:

发送:

编辑: 添加了忘记的代码行。

0 投票
1 回答
5167 浏览

ios - 在 Swift 中使用 CocoaAsyncSocket 接收 SSDP 响应

我正在尝试使用库 CocoaAsyncSocket ( https://github.com/robbiehanson/CocoaAsyncSocket )快速接收 SSDP 响应

我可以成功地将 M-Search 命令发送到多播组并得到响应,我查看了 wireshark(http://i.imgur.com/pn6LB7R.png):我可以看到 M-Search 数据包正在发送出来并返回响应,但我从未在我的应用程序中收到 NSData。(顺便说一句,我现在正在寻找一个 Roku)

我已经实现了 GCDAsyncUdpSocketDelegate 委托并添加了 didReceiveData 函数,但是我从来没有得到数据。

我怀疑这部分有问题:

请看下面的示例代码:

0 投票
0 回答
501 浏览

ios - iOS cocoaAsyncSocket 获取数据解析字符串返回null

我尝试在 iOS 中将 telnet 连接到我的 telnet 服务器端口 23。

我使用“ cocoaAsyncSocket ”库。

我可以从 telnet 接收数据。

但我尝试解码为字符串,数据不是我的预期。

它会显示

如果我使用 NSASCIIStringEncodinging 来解码。

它会显示

我使用终端命令 telnet myIP 23。

我可以在终端下面。

如何解析到 iOS 中的“密码:”字符串?

谢谢你 。

我的连接代码如下:

0 投票
1 回答
853 浏览

ios - iOS protobuf GCDAsyncSocket

我正在编写一个小应用程序,它需要通过 tcp 将 protobuf 消息发送到 netty 服务器,其中使用了 CocoaAsyncSocket/GCDAsyncSocket。

为此,我使用以下代码:

但是,代码总是在 writeToCodedOutputStream 中收到“out of space”错误,其中详细的跟踪信息为:writeToCodedOutputStream/writeEnum/writeTag/writeRawVariant32/writeRawByte/flush。

有什么帮助吗?谢谢!

0 投票
1 回答
382 浏览

tcp - AsyncSocket:始终监听传入的 TCP 消息

我想要一个通过 TCP 连接到服务器的服务,然后不断地监听传入的数据。我正在使用以下方式使用的CocoaAsyncSocket :

然后在阅读委托方法中:

我立即readDataWithTimout:tag:再次打电话给我,这是正确的吗?还是有一种(更好的)方法来始终收听传入的消息?

0 投票
0 回答
87 浏览

ios7 - 当我们触发 iOS7.x 设备的电源按钮时,CocoaAsyncSocket 连接断开

我在我的应用程序中使用 AsyncSocket(不是 GCDAsyncSocket)。它在所有情况下都非常有效,除了一种。即当我触发设备的电源按钮时,连接断开。这仅发生在 iOS 7.x 设备上,但在 iOS 8.x 设备上成功运行。我在我的 plist 中启用了 VOIP,并在 onSocket:didConnectToHost:port 的套接字委托方法中添加了相应的代码,如下所示。

有任何想法吗?

0 投票
1 回答
1240 浏览

ios - GCDAsyncUDPSocket:无法使 IPv6 上的 UDP 多播工作

我无法让 IPv6 上的 UDP 多播工作。我正在尝试执行此操作的平台是 iOS(使用 Swift)。我有一个GCDAsyncUdpSocket并像这样配置它:

之后,我尝试将一些数据发送到多播地址:

那时,当单步执行 GCDAsyncUDPSocket 代码时,我最终调用sendto了方法doSend(第 3919 行)。此调用返回 -1,错误是“没有到主机的路由”。我在 iOS 模拟器中运行它。当我枚举所有可用的网络接口时,我得到了这个:

任何帮助深表感谢!