标签: gcdasyncsocket

为什么GCDAsyncUdpSocket在广播模式下一段时间后无法发送/接收数据包?

我正在使用GCDAsyncUdpSocket在我的应用程序中编写UDP套接字.场景是这样的:当用户点击按钮时,它将在LAN中发送广播数据包然后收听响应,LAN中有一个服务器将响应一个UDP数据包.当应用收到响应时,它会执行某些操作.

我设定GCDAsyncUdpSocket如下:

- (void)setupSocket
{
    _udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

    NSError *error = nil;

    if (![_udpSocket bindToPort:18686 error:&error]) {
        NSLog(@"Error binding: %@",error);
        return;
    }

    if (![_udpSocket beginReceiving:&error]) {
        NSLog(@"Error receiving: %@",error);
        return;
    }

    if (![_udpSocket enableBroadcast:YES error:&error]) {
        NSLog(@"Error enableBroadcast: %@",error);
        return;
    } 
}
Run Code Online (Sandbox Code Playgroud)

然后我按钮按钮动作发送如下:

NSString *host = @"255.255.255.255";
int port = 8585;
NSString *msg = @"Hello from iOS";
NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding];
[_udpSocket sendData:data toHost:host port:port withTimeout:-1 tag:0]; 
Run Code Online (Sandbox Code Playgroud)

- (void)udpSocket:(GCDAsyncUdpSocket *)sock     didReceiveData:(NSData …
Run Code Online (Sandbox Code Playgroud)

udp objective-c broadcast ios gcdasyncsocket

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

Objective-C:在TLS TCP连接上生成由我们自己的PKI(根CA)签名的服务器证书

*解决*

我的问题是引用以下问题:
Objective-C:如何使用签名者的公钥验证SecCertificateRef?

我们拥有自己的PKI,因此我们信任自己的rootCA.使用此rootCA,我们将签署提供给个人服务器的证书.现在我想连接iOS应用程序并检查从服务器发送的证书是否已使用我们的CA签名.

我的应用程序应该能够使用由此建立的TCP连接连接到具有此证书的n个服务器(可能使用零配置服务找到)GCDAsyncSocket.我在我的应用程序中有公共部分证书,我想添加到我的"CertChain",以便应用程序在连接时信任它们.

我已经尝试了很多,但我仍然无法通过SecTrustEvaluate(trust, &result);有效的结果.(我想在生产中使用它,所以请不要告诉我有关停用验证的任何信息)

我的证书:
在app中:rootCA,
服务器上的oldServerCA(cer)(通过信任):homeServer,oldServer

我的证书链:
rootCA签名homeServer
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 for further operations
NSString *certFilePath1 = [[NSBundle mainBundle] pathForResource:@"rootCA" ofType:@"cer"]; // also tried it with 'der', same result
NSData *certData1 = …
Run Code Online (Sandbox Code Playgroud)

tcp objective-c self-signed ios gcdasyncsocket

5
推荐指数
2
解决办法
5226
查看次数

在同一个wifi网络中为数据共享选择什么:Multipeer,Bonjour,Socket连接

我正在通过相同的wifi两个/更多的iOS设备进行数据共享.我已经使用多重网络成功实现了它并从视频文档中进行了探索.我只是在寻找苹果Dev以了解Bonjour与Multipeer Networking之间的区别.团队中是否有一个人同时参与过两次工作,并且可以分享他的选择经验. 我的要求:在同一个Wifi网络中连接两个/多个iOS设备

自动发现和连接.

数据大小可以是1 KB到1 GB(使用MC进行处理).

断开连接时连接数据共享(用MC查找).

哪个更可靠?

你会选择什么?我也在看GCDAsyncSocket(不知道我在正确的方向).

所以请分享您的经验.谢谢.

iphone bonjour ios gcdasyncsocket multipeer-connectivity

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

在 Objective-C 中同步异步任务

我正在尝试使用 GCDAsyncSocket 向我的 iDevice 客户端发送一些图像文件(近 100MB)。

我想同步向客户端发送数据包。我的意思是在向第一个客户端发送 100MB 数据后,迭代到下一个客户端。但是由于 GCDAsyncSocket 的异步性质,我不知道如何序列化这些数据包发送。

我不能使用信号量,因为在发送图像之前,我会与每个客户端协商以了解我应该发送哪些图像,然后尝试发送这些图像。我找不到一种巧妙的方法来等待和向信号量发出信号。

- (void)sendImagesToTheClients:clients
{
    ...
    //negotiating with client to know which images should sent
    ...

    for(Client* client in clients)
    {
       packet = [packet addImages: images];
       [self sendPacket:packet toClient:client];
    }
}

- (void)sendPacket:packet toClient:client
{
 // Initialize Buffer
    NSMutableData *buffer = [[NSMutableData alloc] init];
    NSData *bufferData = [NSKeyedArchiver archivedDataWithRootObject:packet];

    uint64_t headerLength = [bufferData length];
    [buffer appendBytes:&headerLength length:sizeof(uint64_t)];
    [buffer appendBytes:[bufferData bytes] length:[bufferData length]];

    // Write Buffer
    [client.socket …
Run Code Online (Sandbox Code Playgroud)

asynchronous objective-c synchronous grand-central-dispatch gcdasyncsocket

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

GCDAsyncSocket标记参数

我想知道如何在诸如的方法中使用tag参数

readDataWithTimeout: tag:
writeData: tag:
Run Code Online (Sandbox Code Playgroud)

如果我想使用标签来识别数据包的类型,会发生什么?例如,我说tag == 2表示数据包是来自客户端的消息,tag == 1表示数据包是来自服务器的消息...如果可以,我需要调用readData:withTag:几次(每个不同的标签一次)?

[readDataWithTimeout:-1 tag:1];
[readDataWithTimeout:-1 tag:2];
Run Code Online (Sandbox Code Playgroud)

有没有办法说:"读取每个数据而不关心标签",然后在didReadData:withTag:方法根据标签处理数据?

objective-c gcdasyncsocket

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

为什么GCDAsyncSocket readData设计为只读一次?

我发现关于GCDAsyncSocket的didReadData回调不直观的一件事是,除非你发出另一个readData,否则它不会再次调用.为什么这样设计?期望库的用户启动另一个读取调用以获得回调是正确的还是这是一个设计缺陷?

例如

- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket {
     ...
    // initiate the first read
    self.socket = newSocket;
    [self.socket readDataWithTimeout:-1 tag:0];
}

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
    // do what you need with the data...

    // read again, or didReadData won't get called!
    [self.socket readDataWithTimeout:-1 tag:0];
}
Run Code Online (Sandbox Code Playgroud)

objective-c gcdasyncsocket

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

带SSL的GCDAsyncSocket

我运行一个Java服务器,它接受Socket或SSLSocket连接(不同的端口).在客户端,我在我的iPhone应用程序中使用GCDAsyncSocket连接到服务器.如果我使用不安全的版本(没有SSL),哪个工作正常.

现在我尝试使用SSL进行连接.这该怎么做?我完全不知道从哪里开始.我的问题:

1)我需要什么样的证书?Android应用程序可以使用.bks证书在同一台服务器上正常运行

2)如何将证书导入我的应用程序?我希望它稍后通过AppStore分发.我是否必须将证书文件放在应用程序的某个目录中?

3)我在哪里加载代码中的证书?有没有像 - (void)loadCertificate {NSString*myCertificate = @"client.bks"; ...}

4)我必须设置哪些参数来激活GCDAsyncSocket中的SSL,如BOOL useSSL = true; ...

5)假设回答问题1-4.现在怎么办?如何启动与服务器的连接?哪个构造函数与哪个参数一起使用?

如果有人问"为什么使用SSLSocket而不是......".因为服务器已经存在,并且它可以很好地与Android应用程序一起工作.

谢谢您的帮助!

ssl gcdasyncsocket

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

与GCDAsyncSocket和AsyncSocket有什么不同?

一个是GCD,另一个是Runloop?它是抽象的,如何为我的TCP连接选择一个?非常感谢,我只找到如何在github上使用GCDAsyncSocket,但不知道如何选择一个.

objective-c ios gcdasyncsocket

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

使用GCDASyncSocket时如何分离数据包

谁能帮我?我通过使用GCDAsyncSocket在TCP协议上密集交换两个设备之间的数据.我发送这样的数据:

     NSMutableDictionary *packet = [[[NSMutableDictionary alloc] init] autorelease];
     [packet setObject:[NSNumber numberWithInt:MultiPlayerTypeInfoNextRoundConfirm] forKey:@"type_info"];
     [packet setObject:[NSNumber numberWithBool:YES] forKey:@"connection_confirmation"];
     NSMutableData *data = [[NSMutableData alloc] initWithData:[NSKeyedArchiver archivedDataWithRootObject:packet]]; //[NSKeyedArchiver archivedDataWithRootObject:packet];

     if (currentGameMode == GameModeServer)
        [(ServerMultiplayerManager *)multiplayerManager sendNetworkPacket:data withTag:MultiPlayerTypeInfoNextRoundConfirm];

- (void)sendNetworkPacket:(NSData *)data withTag:(long)tag
{
[asyncSocket writeData:data withTimeout:-1 tag:tag];
}

- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
{
   NSLog(@"DID WRITE DATA tag is %ld", tag);

   [sock readDataWithTimeout:-1 tag:0];
}
Run Code Online (Sandbox Code Playgroud)

我读了这样的数据:

- (void)socket:(GCDAsyncSocket *)sender didReadData:(NSData *)data withTag:(long)tag
{
 NSString *receivedInfo = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];

 [info_data setData:data];

NSLog(@"DID READ DATA …
Run Code Online (Sandbox Code Playgroud)

tcp objective-c ios gcdasyncsocket

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

GCDAsyncUDPSocket源地址返回null

谷歌代码问题镜像:https://groups.google.com/forum/#!topic / cocaasyncsocket/grhjZSMLr3U

这是我的代码正在阅读响应:

- (void)init {
    udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

    NSError *error = nil;
    if (![udpSocket bindToPort:UDP_PORT error:&error]) { //not connecting to host
        return;
    }
    if (![udpSocket beginReceiving:&error]) {
        return;
    }
}


- (void)udpSocket:(GCDAsyncUdpSocket *)sock
   didReceiveData:(NSData *)data
      fromAddress:(NSData *)address
withFilterContext:(id)filterContext
{
    NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"got data from broadcast: %@",msg);

    NSString *src = [[NSString alloc] initWithData:address encoding:NSUTF8StringEncoding];
    NSLog(@"got src from broadcast: %@",src); 
}
Run Code Online (Sandbox Code Playgroud)

这是发送udp bcast的代码:

- (void)send {
    [udpSocket enableBroadcast:YES …
Run Code Online (Sandbox Code Playgroud)

udp objective-c ios gcdasyncsocket

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