标签: gcdasyncsocket

无法使用GCDAsyncSocket接收发送的UDP数据包的响应

我正在制作一个应用程序来发送UDP数据包,以便打开一个LED bulb.当我连接到由Ad-hoc创建的创建时,我已经能够执行所有操作Wifi bridge.

现在,我想配置Wifi bridge它,以便它可以连接到我的主路由器.我有AT命令设置来执行此过程,但不知何故,我无法收到Wifi bridge我发送给它的命令的响应.

程序如下: -

  • 步骤1:将UDP消息发送到LAN广播IP地址"10.10.100.255"和端口48899 =>"Link_Wi-Fi"
    LAN上的所有Wifi网桥都将响应其详细信息.回复是"10.10.100.254,ACCF232483E8"

  • 步骤2 :(可选择更改wifi网桥上的设置):然后将"+ ok"发送到LimitlessLED Wifi Bridge.将UDP消息发送到从步骤1"10.10.100.254"=>"+ ok"返回的响应IP地址

  • 步骤3 :(可选择更改wifi网桥上的设置):之后,您可以向模块发送AT命令(以\ r \n结尾).

发送UDP包的代码如下

-(void)configureWifi{

    counter++;
    NSString *host = @"10.10.100.255";
    if ([host length] == 0)
    {
        [self logError:@"Address required"];
        return;
    }

    int port = 48899; //[portField.text intValue];
    if (port <= 0 || port > 65535)
    {
        [self logError:@"Valid port required"];
        return;
    }
    NSString *msg = @"Link_Wi-Fi";
    NSData …
Run Code Online (Sandbox Code Playgroud)

sockets objective-c ios gcdasyncsocket gcdasyncudpsocket

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

iOS上的GCDAsyncUdpSocket缺少多播数据报

我在网络上有一个设备通过UDP组播一个非常小的文件.我正在开发的iOS应用程序负责读取这些数据包,我选择使用GCDAsyncUdpSocket来执行此操作.该文件每半秒发送一次,但我几乎没有经常收到它(大约每3-10秒接收一次).

认为这可能是设备的问题,我开始使用Wireshark监控流量.这似乎反映了我在我的应用程序中看到的内容,直到我在Wireshark中启用"监控模式",此时每个UDP数据包都被捕获.此外,iOS模拟器开始接收所有丢失的数据包,因为它与我正在开发的Mac共享NIC.

有没有办法在iOS设备上启用"监控模式"或者我缺少哪些可以让丢失的数据包进入?我还看到GCDAsyncUdpSocket中有一个readStream方法.也许我需要使用它而不是beginReceiving?虽然如果是这样的话,我不知道如何在Objective-C中设置流.

这是我现在的测试代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"View Loaded");
    [self setupSocket];             
}

- (void)setupSocket
{
    udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    NSError *error = nil;
    if (![udpSocket bindToPort:5555 error:&error])
    {
        NSLog(@"Error binding to port: %@", error);
        return;
    }
    if(![udpSocket joinMulticastGroup:@"226.1.1.1" error:&error]){
        NSLog(@"Error connecting to multicast group: %@", error);
        return;
    }
    if (![udpSocket beginReceiving:&error])
    {
        NSLog(@"Error receiving: %@", error);
        return;
    }
    NSLog(@"Socket Ready");
} …
Run Code Online (Sandbox Code Playgroud)

udp multicast wireshark ios gcdasyncsocket

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

通过在iPhone应用程序中使用GCDAsyncSocket库进行连接后立即断开套接字

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

您可以下载CocoaAsyncSocket Library源代码

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

日志显示:

套接字断开连接:错误域= NSPOSIXErrorDomain代码= 57"操作无法完成.套接字未连接"UserInfo = 0x14cd50 {}

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

提前致谢 !

请看下面的代码:

- (void)connectObdKeyHost:(NSString*)strHost port:(NSString *)strPort {
        [gcdAsyncSocket connectToHost:strHost onPort:portNo withTimeout:30 error:&error];
}

// GCDAsyncSocket Delegate Methods
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port {
   NSLog(@"Socket connected : ");
}

- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
    NSLog(@"Socket disconnected : %@",err);
}
Run Code Online (Sandbox Code Playgroud)

sockets ios cocoaasyncsocket gcdasyncsocket

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

不调用GCDAsynSocketDelegate didReadData方法.使用GCDAsynSocket

我试图简单地使用GCDAsyncSocket发送和接收消息,但无法使其工作.

我正在成功建立连接并写入消息,但是当涉及到阅读时,我的委托从未被调用过.

我正在使用ios5和这个设置:

客户:

-(void) connectToHost:(HostAddress*)host{

    NSLog(@"Trying to connect to host %@", host.hostname);

    if (asyncSocket == nil)
    {
        asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

        NSError *err = nil;
        if ([asyncSocket connectToHost:host.hostname onPort:host.port error:&err])
        {
            NSLog(@"Connected to %@", host.hostname);

            NSString *welcomMessage = @"Hello from the client\r\n";
            [asyncSocket writeData:[welcomMessage dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:1];

            [asyncSocket readDataWithTimeout:-1 tag:0];
        }else
            NSLog(@"%@", err);
    }

}
Run Code Online (Sandbox Code Playgroud)

不调用Delegate didReadData方法

-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{

    NSLog(@"MESSAGE: %@", [NSString stringWithUTF8String:[data bytes]]);

}
Run Code Online (Sandbox Code Playgroud)

服务器

-(void)viewDidLoad{

    asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

    connectedSockets …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c ios5 cocoaasyncsocket gcdasyncsocket

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

为什么EventMachine出站数据缓冲区可能会停止发送并且只是永远填满(而其他连接仍然可以发送)

我有一个EventMachine服务器将TCP数据发送到Mac客户端(通过GCDAsyncSocket).它总是完美无缺地工作一段时间,但服务器不可避免地突然停止逐个连接地发送数据.仍然保持连接,并且服务器仍然从客户端接收数据,但它不会采用其他方式.

当发生这种情况时,我通过连接#get_outbound_data_size发现连接发送缓冲区无限填充(通过#send_data)而不是发送到客户端.

是否存在可能发生这种情况的具体(并且有希望解决)原因?反应堆保持嗡嗡声,与服务器的其他活动连接继续正常工作(尽管它们有时也会陷入缓冲区地狱).

cocoa tcp eventmachine cocoaasyncsocket gcdasyncsocket

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

使用GCDAsynSocket api更新异步值

我正在开发一个应用程序,我需要使用OBD连接器一次更新多个值,如Engine RPM,Speed等参数.我需要实现异步命令/响应.为此,我使用[gcdAsyncSocket writeData:data withTimeout:-1 tag:uniqueTag];异步标签异步发送命令.

但是当调用gcdAsync的委托方法"socketDidReadDatawithTag"时,它会返回数据,但它不正确.如果我已发送一个命令"010C\r"(读取RPM)和"010D\r"(速度),则使用Tag分别为263和264,如果我用socketDidReadDatawithTag中的标签264解析响应,有时它会返回RPM的数据.(我的响应混乱或OBD设备无法处理异步响应)

    NSLog(@"Command Sent for Async : %@",commandString);
    NSData *data = [commandString dataUsingEncoding:NSASCIIStringEncoding];

    long obdObjectTag = [obdObject getPIDTag];//Unique Tag
    [gcdAsyncSocket writeData:data withTimeout:-1 tag:obdObjectTag];

    NSData *readData = [@">" dataUsingEncoding:NSASCIIStringEncoding];
    [gcdAsyncSocket readDataToData:readData withTimeout:-1 tag:obdObjectTag];
Run Code Online (Sandbox Code Playgroud)

并且socketdidReadDatawithTag数据和标签不匹配.

asynchronous ios gcdasyncsocket obd-ii

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

GCDAsyncSocket服务器仅首次接收数据

每次按下发送按钮但客户端第一次收到消息时,客户端都会发送消息.服务器有什么问题

服务器:

- (void)viewDidLoad
{
    [super viewDidLoad];

    asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

    NSError *err = nil;
    if (![asyncSocket acceptOnPort:10000 error:&err]){

        NSLog(@"Error in acceptOnPort:error: -> %@", err);

    }
}

- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{
    NSLog(@"Accepted new socket from %@:%hu", [newSocket connectedHost], [newSocket connectedPort]);

    self.asyncSocket = newSocket;
    NSString *welcomMessage = @"Hello from the server\r\n";
    [self.asyncSocket writeData:[welcomMessage dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:1];

    [self.asyncSocket readDataWithTimeout:-1 tag:0];

}

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

    NSLog(@"MSG: %@",msg);

}
Run Code Online (Sandbox Code Playgroud)

客户:

- …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c ios gcdasyncsocket

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

多个设备中[NSDate date]的结果不同

首先,我必须说我在日期和时间设置中设置了自动设置,并且每个设备的时区是相同的.所以我用它[NSDate date]来获取时间戳,以毫秒为单位,然后编码NSData并发送到另一台设备.接收器数据正在被解码并用新的减去[NSDate date].这样我就可以获得发送和接收消息所需的总时间.我被认为是因为当发送者是iPhone 4 iOS6而接收者是iPhone 5 iOS7时接收者比发送者有更早的时间戳.我不知道为什么?[NSData date]对于那种操作,也许不是最可靠的类?我GCDAsyncUdpSocket用于发送/接收UDP.

代码发送者

NSData *data2 = [self createRandomNSData:8192];
NSMutableData *dataToSend =[NSMutableData data];
[dataToSend appendBytes:&tag length:sizeof(int)];
long long currentTimeStamp = (long long)([[NSDate date] timeIntervalSince1970]*1000.0);
[dataToSend appendBytes:&currentTimeStamp length:sizeof(long long)];
[dataToSend appendData:data2];
NSLog(@"%i || %lld || %lu",tag, currentTimeStamp,(unsigned long)[dataToSend length]);
[_udpSocket sendData:dataToSend toHost:@"230.0.0.1" port:_port withTimeout:-1 tag:tag];
tag++;
Run Code Online (Sandbox Code Playgroud)

代码接收器

char* dataBytes = [data bytes];
int inTag;
long long inCurrentTimeStamp;
[data getBytes:&inTag length:sizeof(int)];
[data getBytes:&inCurrentTimeStamp range:NSMakeRange(sizeof(int), sizeof(long long))];
long …
Run Code Online (Sandbox Code Playgroud)

iphone udp nsdate ios gcdasyncsocket

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

Swift中的GCDAsyncSocket

我想打开一个基于ELM327芯片的OBD加密狗的TCP连接.所以我决定使用GCDAsyncSocket库.我写了这段代码,

import UIKit
import CocoaAsyncSocket

class ViewController: UIViewController, GCDAsyncSocketDelegate {

    let addr = "192.168.0.10"
    let port:UInt16 = 35000
    var socket:GCDAsyncSocket!

    override func viewDidLoad() {
        super.viewDidLoad()
        socket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue())
        do {
           try socket.connectToHost(addr, onPort: port)
        } catch let e {
           print(e)
        }

    // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
       // Dispose of any resources that can be recreated.
    }

    @IBAction func connect(sender: AnyObject) {
      print("Clicked")
    } …
Run Code Online (Sandbox Code Playgroud)

sockets tcp ios gcdasyncsocket swift

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

CocoaAsyncSocket TCP代理/隧道

我正在使用CocoaAsyncSocket尝试创建TCP隧道/ mux/demux,通过端口对(A < - > B)转发所有连接.写入端口A的所有内容都应该从端口B"出来",反之亦然.我只能使用端口A和B,无法打开其他端口.

我正在创建2监听AsyncSocketsA和B,并有2个连接客户端阵列,并在

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag if (sock.localPort == B.localPort) { for (AsyncSocket * cl in clientsOfA) { [cl writeData:data withTimeout:-1 tag:0]; [cl readDataWithTimeout:-1 tag:0]; } [sock readDataWithTimeout:-1 tag:0]; } 我在端口AI上读到的所有内容都将发送给端口B的所有客户端,反之亦然.在A的一侧有一个Safari,向A提出请求.

我的问题是:当数据从B端口返回时,在A端我有5个客户端(谢谢Safari ...),我不知道哪一个最初请求当前数据包,所以我发送数据到他们所有人......好吧......一切都搞砸了.

这种多路复用器/多路复用器能否以这种方式实现?或者实现这一目标的正确方法是什么?我怎样才能区分发起客户?

sockets objective-c ios cocoaasyncsocket gcdasyncsocket

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