问题标签 [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 投票
1 回答
767 浏览

objective-c - GCDAsyncSocket 连接失败——仅当套接字变量称为“套接字”时。怎么了?

我有一个比任何事情都更让我困惑的问题。我正在尝试使用 GCDAsyncSocket 在 Objective-C 中建立套接字连接。当且仅当调用套接字变量时,我发送到我的 GCDAsyncSocket 的 connectToHost 消息失败并显示 EXC_BAD_ACCESS socket。确切地说,这不是问题,因为我很容易使用不同的变量名,但我很好奇为什么会发生这种情况。

这是我认为是我的代码的相关部分,来自我创建的一个名为 SocketManager 的类。大部分代码取自GCDAsyncSocket intro。下面的代码在指示行出现 EXC_BAD_ACCESS 失败。

但是,如果我将变量名称从sockettosockbanana任何其他名称更改,代码运行良好,这让我很奇怪。为什么会这样?是socket某种保留的系统字吗?如果是这种情况,我希望代码根本无法编译,但我对 Objective-C 还是很陌生。

顺便说一句,我的didConnectToHost:委托方法很少被调用,我认为这是一个单独的问题,但据我所知,它可能是相关的。

0 投票
1 回答
301 浏览

ios - 如何从 CocoaAsyncUDPSocket 获取地址

有谁知道在 CocoaAsyncSockets 中接收 UDP 数据的委托方法在获取源地址时是如何工作的?具体方法

该地址返回为NSData*但使用NSUTF8StringEncoding返回解释它nullNSASCIIStringEncoding返回一堆乱码。它应该如何解释?

0 投票
1 回答
13744 浏览

ios - GCDAsyncUdpSocket 和多播发送和接收

在第一种方法中,我创建了基于sampleProject的客户端-服务器应用程序,它将一些数据发送到服务器。

工作代码

仅出于公共原因故意跳过错误检查

发件人

接收器/监听器


组播

但后来我想要将发送给许多接收者的客户端。我知道 sendre 或 listener 应该使用 [GCDAsyncUdpSocket joinMulticastGroup:error]; 的表单。我通过 stackoverflow、google 叔叔和 CococaAsyncSocket(没有关于 udp 的词)运行,匹配收集到的信息并想出了这段代码。我完全确定,这不起作用,但我不知道为什么。

不工作的代码

接收器/监听器

更新:

事实证明,当我使用一些未使用的 IPaddress例如@“224.0.1.1”时,它会工作,但感觉有点奇怪。我做对了吗?

0 投票
1 回答
960 浏览

ios - 当我使用 AsyncUdpSocket 对象发送 IP 数据包时,它并不总是有效

我正在使用 cocoaAsyncSocket。我从那里得到它。AsyncUdpSocket 对象仅在我初始化此对象时帮助我发送 IP 数据包。当我使用 [engineObject startSession] 调用其他控制器中的函数时,该函数正在工作,但 AsyncUdpSocket 对象不会发送任何 IP 数据包。它不会调用(或触发)委托方法:didSendDataWithTag 或 didNotSendDataWithTag .....

我做错了什么?

。H

.m

0 投票
1 回答
372 浏览

tcp - CocoaAsyncSocket Apple Mach-O 链接器错误

我需要使用 CocoaAsyncSocket 接收 TCP 数据包。当我将该库导入 Xcode 并尝试运行我的应用程序时,它给了我 Apple Mach-O 链接器错误:

那么,我能做什么???

0 投票
0 回答
797 浏览

networking - CocaAsyncSocket 丢失 UDP 数据包,可能是 iOS 7/iPad 问题?

我目前正在使用 XCode 5.0 并正在开发一个使用CocoaAyncSocket库的 iOS 7 示例应用程序。在此应用程序中,“发送者控制器”发送 UDP 消息以255.255.255.255port 4000“接收者控制器”处理并打印出来。“发送者控制器”有一个 for 循环,可以广播 200 次消息。使用 Wireshark(过滤udp.port == 4000),在 200 个数据包中,有 0 个数据包丢失,太棒了!在这种环境下,一切正常,“接收控制器”打印出所有消息。

但是现在当我将应用程序移动到实际的 iPad(iPad MD328LL/A 16GB,Wi-Fi 第三代 iOS 7)时,一些数据包丢失了。在这 200 个数据包中,大约 60% - 65% 的数据包被 WireShark 拾取并送到“接收控制器”。我不太确定它是库(我不认为,因为它与模拟器完美配合)还是导致数据包丢失问题的 iOS 7/iPad。

代码:

我知道在这种情况下,这些消息正在以很快的速度发送,用户不太可能发送 200 个这样的广播。我也知道 UDP 很便宜,并且偶尔会出现格式错误或丢失数据包的可能性,但发生率为 40%……这对我来说似乎相当高。

如果有人对此或任何有用的信息有任何建议/经验,将不胜感激

提前致谢!

0 投票
1 回答
895 浏览

ios - Cocoaasyncsocket 多写操作

我已经在我的应用程序中实现了 gcdasynsocket 并执行了多个写入操作。委托 didWriteDataWithTag 被调用了两次,但 didreaddata 只被调用了一次(即)仅用于一次写入操作。

GCDasyncsocket 委托方法

我不确定出了什么问题。请帮我解决问题

0 投票
0 回答
831 浏览

objective-c - 在 CocoaAsyncSocket 中添加 SOCKS 代理支持

我向 CocoaAsyncSocket 添加了 SOCKS 功能。我首先尝试在 GCDAsyncSocket 上执行此操作,但失败了。

对于 CocoaAsyncSocket,我只需在此方法中的读/写流上设置 SOCKS 属性(在 GCDAsyncSocket 中,只有 iOS 使用使用 CFSocket 的读/写套接字)这被粘贴在方法中 - (BOOL)createStreamsToHost:(NSString )hostname onPort:( UInt16)端口错误:(NSError * )errPtr

它运行良好,因为它通过代理路由所有流量。但要么我不明白代理是如何工作的,要么我做错了什么,因为:

无论服务器是否响应,这始终返回 true。因为代理响应。CocoaAsyncSocket 的委托方法

使用代理服务器的主机和端口调用,而不是我调用 connectToHost:onPort:error 的服务器。

我在这里想念什么?

0 投票
1 回答
2397 浏览

ios - 使用 iPhone 应用程序中的 GCDAsyncSocket 库建立连接后立即断开套接字

我想从启用 OBD2 Wifi 的适配器读取和写入数据,该适配器用于读取汽车数据和故障代码。为此,我使用 GGCDAsyncSocket 库进行套接字连接。

可以下载CocoaAsyncSocket 库源代码

但它几乎保持连接 10 秒,有时 40-50 秒,然后终止。

日志显示:

套接字断开:错误域 = NSPOSIXErrorDomain 代码 = 57“操作无法完成。套接字未连接”用户信息 = 0x14cd50 {}

任何帮助或想法将不胜感激!

提前致谢 !

请看下面的代码:

0 投票
1 回答
506 浏览

objective-c - 如何从异步 tcp 套接字读取可变长度数据?

我正在将CocoaAsyncSocket用于 iOS 项目。我正在尝试通过异步接口读取VarInts 。这个问题与字符串之类的其他东西不同,我可以在其中添加一个长度前缀,但我事先不知道 varint 的长度。它需要一次处理一个字节,但由于每个读取操作都是异步的,其他读取调用可能已在其间排队。

我考虑读入一个缓冲区然后处理它,比如读取 5 个字节(varint-32 的最大长度),然后将额外的字节推回,但如果 varint 只有 4 个字节并且我正在等待一个第 5 个字节可用。

我怎样才能做到这一点?此外,我无法更改另一端的协议以使用固定大小的整数。


这是 Josh 要求的代码片段

回调保存在字典中,用于委托方法socket: didReadData: withTag

假设我正在逐字节读取 VarInt:

  • 执行读取 varint 的第一个字节
  • 不知道我们是否需要为 varint 读取另一个字节;这取决于第一次读取的结果
  • (可能)为其他内容读取另一个字节
  • 读取 varint 的第二个字节,但现在实际上是读取的第三个字节

我可以想象使用一个标志来指示我是否处于多部分读取中,并使用一个队列来保存应该在多部分读取之后执行的读取,并且我已经开始编写它,但是它非常混乱。只是想知道是否有标准/推荐/更好的方法来解决这个问题。