似乎标题是自描述性的。 我想增加在我的应用程序发送和接收数据的速度,我被告知设置tcp_nodelay为true。 但我不知道如何用GCDAsyncSocket做到这一点。 谁能帮我?
在我基于TCP套接字的服务器上,我发送了一个数据包,数据包由一个指定数据包中的字节数的头部组成,然后是这个字节数。 对于那些熟悉Erlang的人,我只是设置{packet,4}选项。 在iOS端,我看起来像这样的代码,假设我想知道这个消息的stream的大小: [asyncSocket readDataToLength:4 withTimeout:-1 tag:HEADER_TAG]; 这工作正常,并调用下面的委托方法callback: onSocket:didReadData:withTag: 我想下一个合乎逻辑的步骤是计算出stream的大小,我这样做: UInt32 readLength; [data getBytes:&readLength length:4]; readLength = ntohl(readLength); 在服务器端对12个字节的string进行硬编码之后,readLength确实也在客户端读取了12个字节,所以目前为止都是很好的。 我继续以下内容: [sock readDataToLength:readLength withTimeout:1 tag:MESSAGE_TAG]; 此时尽pipeonSocket:didReadData:withTag:的callback不再被调用。 读取时发生超时,可能是因为我没有正确处理读取操作,这个委托方法被调用: – (NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)length 所以服务器总共发送了16个字节,一个4字节的标题和一个12字节的二进制stream。 我相信,错误是我如何使用CocoaAsyncSocket。 在了解其尺寸之后,阅读其余部分stream程的正确方法是什么? **更新** 我改变了我的客户,似乎现在正在工作。 问题是,我不明白新解决scheme的readDataToLength点。 这是我改变我的初步阅读: [socket readDataWithTimeout:-1 tag:HEADER_TAG]; 现在在我的callback中,我只是做了以下几点: – (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag { if (tag == HEADER_TAG) { […]
我正在尝试在OS X和iOS(8.1版本)上使用openssl之间的SSL TCP连接。 Exception Domains有192.168.0.104 。 Swift iOS代码: class SSLSocketLite { // The input stream. private var inStream: NSInputStream? // The output stream. private var outStream: NSOutputStream? // The host to connect to. private var host: String // The port to connect on. private var port: Int init(inHost:String, inPort:Int) { host = inHost port = […]
* 解决 * 我的问题是参考以下问题: Objective-C:如何用签名者的公钥validationSecCertificateRef? 我们有自己的PKI,所以我们信任自己的rootCA。 通过这个rootCA,我们签署了传递给个人服务器的证书。 现在我想连接iOS应用程序,并检查从服务器传递的证书是否与我们的CA签名。 我的应用程序应该能够使用由GCDAsyncSocketbuild立的TCP连接来连接到具有此证书的n台服务器 (可能使用零configuration服务)。 我有我的应用程序中的证书的公共部分,我想添加到我的“CertChain”,所以应用程序将信任他们连接。 我尝试了很多,但是我仍然无法通过SecTrustEvaluate(trust, &result); 有效的结果。 (我想在生产中使用它,所以请不要告诉我有关停用validation的任何事情) 我的证书: 在app:rootCA,oldServerCA(cer) 在服务器上(通过信任):homeServer,oldServer 我的证书链: 根CA签署的家庭服务器 oldServerCA签署了oldServer 我的代码部分: 添加更新 – (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port; { // Configure SSL/TLS settings NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithCapacity:3]; // Allow self-signed certificates [settings setObject:[NSNumber numberWithBool:YES] forKey:GCDAsyncSocketManuallyEvaluateTrust]; [sock startTLS:settings]; // get the certificates as data […]
苹果设备===路由器=== WiFi模块 苹果设备(iPhone)正在通过TCP连接连接到WiFi模块端口2000。 我想在Apple设备上激活TCP keepalive包发送,以确定什么时候TCP连接到WiFi模块丢失(模块closures)。 我的stream设置 CFReadStreamRef readStream; CFWriteStreamRef writeStream; CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)CFBridgingRetain(moduleIPaddress), port2000, &readStream, &writeStream); outputStream = (NSOutputStream *)CFBridgingRelease(writeStream); inputStream = (NSInputStream *)CFBridgingRelease(readStream); [outputStream setDelegate:(id)self]; [inputStream setDelegate:(id)self]; [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [outputStream open]; [inputStream open]; 我试图激活keepalive根据大卫H后保持套接字连接在iOS中活着 – (void) stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { switch (streamEvent) { case NSStreamEventOpenCompleted: if (theStream == outputStream) […]
我已经工作了5天,试图学习和实施iPhone上的networking监视器。 我看着苹果公司的netstat代码,而且我的头发损失了25%。 我findJB设备的链接,但我需要它在非JB设备上执行。 (无论苹果是否在App Store上接受)。 我发现了一些有用的链接: 如何获得tcp udp在iPhone上打开端口列表 (我无法parsing在这个问题中返回的数据:() iPhone上的数据使用情况 sysctlbyname buf返回types (我不是一个networking人..不能理解这一个,可能是你们可以帮助:)) TCP / UPD端口列表 我可以说我从第一个链接得到了一些东西。 你们能帮我parsing数据吗? 有没有其他的方法来实现这个?
我已经写了这个代码来设置一个服务器的stream: -(void)streamOpenWithIp:(NSString *)ip withPortNumber:(int)portNumber; { CFReadStreamRef readStream; CFWriteStreamRef writeStream; CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (__bridge CFStringRef)ip, portNumber, &readStream, &writeStream); if(readStream && writeStream) { CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); //Setup inpustream inputStream = (__bridge NSInputStream *)readStream; [inputStream setDelegate:self]; [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [inputStream open]; //Setup outputstream outputStream = (__bridge NSOutputStream *)writeStream; [outputStream setDelegate:self]; [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [outputStream open]; […]