【问题标题】:Little problem with AsyncUdpSocket receiving data after connecting to broadcast instead of serverAsyncUdpSocket 连接广播而不是服务器后接收数据的小问题
【发布时间】:2011-04-26 12:16:23
【问题描述】:

我对 AsyncUdpSocket 有疑问。

我曾经连接到服务器,发送一些数据并获得一些响应。现在由于我不知道服务器的实际地址,我不得不更改我的代码并将数据发送到广播地址 255.255.255.255。

这是我的代码:

NSString *bchost = @"255.255.255.255";
NSString *host = @"10.1.0.1";
int udpPort = 6001;

AsyncUdpSocket *udpSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
[udpSocket bindToPort:udpPort error:nil];
[udpSocket enableBroadcast:YES error:nil]; 
NSError *error = nil;
if ([udpSocket connectToHost:bchost onPort:udpPort error:&error])
{
[udpSocket receiveWithTimeout:10 tag:0];
[self sendToUDPServer:@"HELLO"];
}

所以,问题在于它适用于“主机”,但不适用于“bchost”。在这两种情况下,我在服务器端都看到数据被接收,并且答案被发送到发送者的地址(应该是 iOS 设备),但是在设备上,当我将数据发送到 bchost 时,我没有得到数据。

知道我错过了什么吗?

【问题讨论】:

  • 您是否尝试将广播绑定到与实际连接完全不同的端口?

标签: iphone sockets broadcast


【解决方案1】:

好的,不幸的是,所有回复都对我不起作用,但我终于找到了解决方案;)

NSString *bcHost = @"255.255.255.255";
NSString *anyHost = @"0.0.0.0";

int UDP_SOCKET_PORT =         6001;
int DISCOVERY_PORT  =       6003;

udpSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
[udpSocket bindToAddress:anyHost port:DISCOVERY_PORT error:nil];  
[udpSocket enableBroadcast:YES error:nil]; 
[udpSocket receiveWithTimeout:10 tag:0];
[udpSocket sendData:[@"Hello" dataUsingEncoding:NSASCIIStringEncoding] toHost:bcHost port:UDP_SOCKET_PORT withTimeout:-1 tag:0];

如果后面有服务器,它将触发响应,这也将允许从服务器获取 ip 以进行进一步处理。

【讨论】:

  • 我也有同样的问题,解决不了,能不能给我点思路?
【解决方案2】:

您正在“连接”到主机。根据Unix socket FAQ,这意味着您只会收到源 IP 地址为 255.255.255.255 的 UDP 数据包。连接为 UDP 建立了一对一的关系,因此接收到的源地址与连接地址不同的数据包将被过滤。

如果您没有连接(您必须更改发送线路以定位广播地址),它应该可以工作。您将发送toHost:bcHost -- 然后您的接收应该会收到所有发往其端口的数据包。

【讨论】:

  • 你能不能详细点..我到底需要做什么//what'll send toHost:bcHost -- and then your receive should get all packets sent to its port."那条线意味着...
【解决方案3】:

根据 Arthur 的回答,这是工作代码。我想知道接收是否应该在发送之前开始,只是为了确保我们不会在接收准备好之前错过一个非常快速的回复,但到目前为止,在我的情况下似乎没有必要。另外,请参考this post 了解如何创建接收方法。

AsyncUdpSocket *udpSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
[udpSocket bindToPort:1234 error:nil ];
[udpSocket enableBroadcast:YES error:nil];

NSData* data=[messageToSend dataUsingEncoding:NSUTF8StringEncoding];

if ([udpSocket sendData:data toHost:@"255.255.255.255" port:4321 withTimeout:3 tag:0])
{
    //2 second timeout. onUdpSocket methods will provide results
    [udpSocket receiveWithTimeout:2 tag:0];
}

【讨论】:

    【解决方案4】:

    我可能完全疯了,但这似乎是 iOS 上 AsyncUdpSocket 的一个长期存在的问题。

    在他们的 Google 代码页面上有几个与您的错误报告相似甚至相同的错误报告;人们抱怨广播后无法接收 Udp 数据包,在某些情况下甚至根本无法接收。

    http://code.google.com/p/cocoaasyncsocket/issues/list?can=2&q=AsyncUdpSocket+receive

    【讨论】:

    • 您认为新库仍然如此吗? GCDAsyncUdpSocket?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    相关资源
    最近更新 更多