标签: cfstream

如何在iPhone上使用CFStream和RakNet?

我正在尝试创建一个将在后台运行并在客户端和服务器之间使用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)

ios cfstream raknet

8
推荐指数
0
解决办法
425
查看次数

设置SOCKS代理配置后CFStream崩溃

下面的代码有什么问题?我使用AsyncSocket连接到SOCKS代理并在onSocketWillConnect委托方法上设置代理设置.如果我省略了调用CFReadStreamSetPropertyCFWriteStreamSetProperty插座式连接器能够顺利跟进.另外,我在一个没有可跟踪堆栈跟踪的解除分配的实例上得到[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)

objective-c socks cfnetwork ios cfstream

7
推荐指数
1
解决办法
1088
查看次数

如何为SSL握手配置CFStream(或NSStream)?

我正在使用CFStream/NSStream来建立http连接.我希望能够在三种情况下检测到SSL握手失败:

  • 案例A:服务器不受信任
  • 情况B:服务器是可信的但是要求客户端证书
  • 情况C:服务器不受信任,它会询问客户端证书

今天没有对我的CFStream的SSL属性进行测试,我得到:

  • 案例A:错误-9807
  • 情况B:没有错误,但服务器拒绝连接(错误500)
  • 案例C:错误9807

有没有办法配置CFStream来正确区分这三种情况?或者在SSL握手期间进行一些回调?

谢谢你的帮助.

ssl objective-c nsstream cfnetwork cfstream

6
推荐指数
1
解决办法
2930
查看次数

CFStream + SSL 导致 OSStatus 错误 -108

我有一些代码可以为启用CFStreamSSL/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)

iphone ssl networking cocoa-touch cfstream

5
推荐指数
0
解决办法
836
查看次数

访问一块内存(/ C/C++数组),就好像它是一个文件流一样

有没有办法在C(或C++)中执行此操作?

背景信息:我将逐行读取内存块或大文件,并逐个处理这些行,我懒得两次写同样的东西,一次用于内存块,一次用于文件流.如果需要使用文件流版本,则该文件将不适合内存.可以理解的是,我可以将内存块保存到文件中,然后使用文件流访问相同的数据,但这样会浪费计算机时间.

我知道linux系统上的/ dev/shm.有没有更便携的东西在语言层(C或C++)给我同样的抽象?

c c++ fstream cfstream

4
推荐指数
1
解决办法
863
查看次数

NSStream在打开期间接收NSStreamEventEndEncountered

我有一个使用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)

sockets nsstream cfstream

3
推荐指数
1
解决办法
3911
查看次数

CFStreamCreatePairWithSocketToHost意外地与Swift崩溃

最后在这里问我的第一个问题!

预先: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 cfstream swift

2
推荐指数
1
解决办法
2583
查看次数

CFStream SSL错误-9800


我的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)

iphone ssl objective-c ios cfstream

1
推荐指数
1
解决办法
2290
查看次数