我正在尝试创建一个将在后台运行并在客户端和服务器之间使用Raknet传输数据的iPhone应用程序.我按照教程来运行一个简单的聊天客户端和服务器.
我希望应用程序在后台运行时收到有关传入数据的通知,但看起来我必须使用CFStreams来代替RakNet创建的套接字.有没有办法做到这一点?
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
mRakPeer = RakPeerInterface::GetInstance();
mClientID = UNASSIGNED_SYSTEM_ADDRESS;
SocketDescriptor socketDescriptor(54001,0);
socketDescriptor.socketFamily=AF_INET;
mRakPeer->Startup(8,&socketDescriptor, 1);
mRakPeer->SetOccasionalPing(true);
ConnectionAttemptResult car = mRakPeer->Connect("192.168.1.3", 54000, "Rumpelstiltskin", (int) strlen("Rumpelstiltskin"));
RakAssert(car==RakNet::CONNECTION_ATTEMPT_STARTED);
}
Run Code Online (Sandbox Code Playgroud) 下面的代码有什么问题?我使用AsyncSocket连接到SOCKS代理并在onSocketWillConnect委托方法上设置代理设置.如果我省略了调用CFReadStreamSetProperty和CFWriteStreamSetProperty插座式连接器能够顺利跟进.另外,我在一个没有可跟踪堆栈跟踪的解除分配的实例上得到[Not A Type retain](它可能与CFNetwork有关?).有谁知道是什么给出的?
CFDictionaryRef proxyDict = CFNetworkCopySystemProxySettings();
CFMutableDictionaryRef socksConfig = CFDictionaryCreateMutableCopy(NULL, 0, proxyDict);
CFDictionarySetValue(socksConfig, kCFStreamPropertySOCKSProxyHost, CFSTR("192.168.1.148"));
CFDictionarySetValue(socksConfig, kCFStreamPropertySOCKSProxyPort, (__bridge CFNumberRef)[NSNumber numberWithInt:3129]);
CFDictionarySetValue(socksConfig, kCFStreamPropertySOCKSVersion, kCFStreamSocketSOCKSVersion4);
// set SOCKS for read streams
CFReadStreamRef readStream = [sock getCFReadStream];
if (!CFReadStreamSetProperty(readStream, kCFStreamPropertySOCKSProxy, socksConfig)) {
CFStreamError error = CFReadStreamGetError(readStream);
NSLog(@"[SEVERE] Web Socket Read Stream Error: %ld[%ld]", error.domain, error.error);
}
// set SOCKS for write stream
CFWriteStreamRef writeStream = [sock getCFWriteStream];
if (!CFWriteStreamSetProperty(writeStream, kCFStreamPropertySOCKSProxy, socksConfig)) {
CFStreamError error = …Run Code Online (Sandbox Code Playgroud) 我正在使用CFStream/NSStream来建立http连接.我希望能够在三种情况下检测到SSL握手失败:
今天没有对我的CFStream的SSL属性进行测试,我得到:
有没有办法配置CFStream来正确区分这三种情况?或者在SSL握手期间进行一些回调?
谢谢你的帮助.
我有一些代码可以为启用CFStream了SSL/TLS的远程服务器创建一对对象。这段代码在 OS X 上运行得很好,但在 iOS 下运行时,它失败了。这是控制台日志:
2011-04-26 22:39:35.820 RemoteSample[92127:40b] connecting to 192.168.1.187:8099
2011-04-26 22:39:35.825 RemoteSample[92127:40b] INPUT: NSStreamEventOpenCompleted
2011-04-26 22:39:35.825 RemoteSample[92127:40b] OUTPUT: NSStreamEventOpenCompleted
2011-04-26 22:39:35.827 RemoteSample[92127:40b] INPUT: NSStreamEventErrorOccurred
2011-04-26 22:39:35.828 RemoteSample[92127:40b] Error on input stream: The operation couldn’t be completed. (OSStatus error -108.)
2011-04-26 22:39:35.829 RemoteSample[92127:40b] OUTPUT: NSStreamEventErrorOccurred
2011-04-26 22:39:35.829 RemoteSample[92127:40b] Error on output stream: The operation couldn’t be completed. (OSStatus error -108.)
Run Code Online (Sandbox Code Playgroud)
OSStatus 错误 -108 似乎是 memFullErr,这很奇怪,我不太确定该怎么办。这发生在模拟器和设备上。它在 Mac OS X 应用程序中编译和运行时不会出现此问题。只有在为 iOS 构建时才会发生此错误。
花了几个小时尝试各种想法和大量搜索后,我可以使用一些有关下一步的建议。
这是代码:
CFReadStreamRef …Run Code Online (Sandbox Code Playgroud) 有没有办法在C(或C++)中执行此操作?
背景信息:我将逐行读取内存块或大文件,并逐个处理这些行,我懒得两次写同样的东西,一次用于内存块,一次用于文件流.如果需要使用文件流版本,则该文件将不适合内存.可以理解的是,我可以将内存块保存到文件中,然后使用文件流访问相同的数据,但这样会浪费计算机时间.
我知道linux系统上的/ dev/shm.有没有更便携的东西在语言层(C或C++)给我同样的抽象?
我有一个使用NSStream连接的客户端 - 服务器应用程序.有时在尝试打开连接时,连接的一端在首次尝试发送消息时会获得NSStreamEventEndEncountered.
我使用CFStream和NSStream之间的桥梁.我的服务器创建一个套接字:
_ipv4cfsock = CFSocketCreate(kCFAllocatorDefault,PF_INET, SOCK_STREAM,IPPROTO_TCP, kCFSocketAcceptCallBack, handleConnect, &info);
Run Code Online (Sandbox Code Playgroud)
在handleConnect回调函数中,CFStreamCreatePairWithSocket用于获取两个CFStream.
我的客户端CFStreamCreatePairWithSocketToHost用来连接主机.
客户端连接(创建NSStream)然后发送ping.当我的服务器收到连接时,它会打开一个NSStream,当它收到ping时它发送一个pong.
当其中一个连接关闭时,另一个应该获得NSStreanEventEndEncountered,因为我已kCFStreamPropertyShouldCloseNativeSocket在流上设置为true.
我得到了几个不同的结果:我使用NSLog来查看发生了什么.
- 大多数时候连接打开并按预期工作.
Server did recieve new connection
Server recieved ping
Server Sent pong
Client recieved pong
Run Code Online (Sandbox Code Playgroud)
- 尝试发送pong时,连接关闭(NSStreamEventEndEncountered).客户端不接收pong但收到NSStreamEventEndEncountered
Server did recieve new connection
Server recieved ping
Server recieved pong
Server closed
Client closed
Run Code Online (Sandbox Code Playgroud)
- 尝试发送ping时连接关闭(NSStreamEventEndEncountered).服务器不接收ping或NSStreamEventEndEncountered
Server did recieve new connection
Client closed
Run Code Online (Sandbox Code Playgroud)
- 尝试发送ping时收到错误:
Server did recieve new connection;
Error recieved: The operation couldn’t be completed. Connection reset …Run Code Online (Sandbox Code Playgroud) 最后在这里问我的第一个问题!
预先:Xcode 7.1.1,OS 10.11.2,iOS 9.0.2(在物理设备上)
我正在写一个与我的Raspberry Pi通信的小应用程序.我有一些工作代码是用Obj-C(iOS 7)编写的,从教程中借用,它在Obj-C中都能正常工作(连接和行为与Pi一样).问题在于为Swift/iOS 9重写它(这是目标).
好一点:
func initNetworkCommunication() {
var readStream: Unmanaged<CFReadStreamRef>?
var writeStream: Unmanaged<CFWriteStreamRef>?
CFStreamCreatePairWithSocketToHost(nil, "192.168.1.22", 777, &readStream, &writeStream)
inputStream = readStream?.takeRetainedValue() as! NSInputStream
outputStream = writeStream?.takeRetainedValue() as! NSOutputStream
inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
inputStream.open()
outputStream.open()
}
Run Code Online (Sandbox Code Playgroud)
我认为问题在于上面,因为这是堆栈中的最后一个方法调用,但是应用程序在很少信息的情况下悄悄地崩溃:
任何帮助将非常感激!
请随时询问更多信息.
ps我明白这个网站的格式是相当"严格",我错过了什么,过度等等,请让我知道:)
我的iOS应用程序包含2个版本:服务器和客户端.服务器通过Bonjour发布服务并等待客户端.客户端搜索该服务并连接到服务器.之后所有通信都通过CFSockets实现.
以下是我为此类通信设置流的代码:
- (BOOL)setupSocketStreams {
if ( readStream == nil || writeStream == nil ) {
return NO;
}
incomingDataBuffer = [[NSMutableData alloc] init];
outgoingDataBuffer = [[NSMutableData alloc] init];
// Turning SSL on
NSDictionary *sslSettings = [NSDictionary dictionaryWithObjectsAndKeys:(id)kCFBooleanFalse, (id)kCFStreamSSLValidatesCertificateChain, nil];
CFReadStreamSetProperty(readStream, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelNegotiatedSSL);
CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, sslSettings);
CFWriteStreamSetProperty(writeStream, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelNegotiatedSSL);
CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, sslSettings);
CFReadStreamSetProperty(
readStream,
kCFStreamPropertyShouldCloseNativeSocket,
kCFBooleanTrue
);
CFWriteStreamSetProperty(
writeStream,
kCFStreamPropertyShouldCloseNativeSocket,
kCFBooleanTrue
);
CFOptionFlags registeredEvents =
kCFStreamEventOpenCompleted |
kCFStreamEventHasBytesAvailable |
kCFStreamEventCanAcceptBytes |
kCFStreamEventEndEncountered |
kCFStreamEventErrorOccurred
;
CFStreamClientContext ctx = {
0, …Run Code Online (Sandbox Code Playgroud)