连接到广播而不是服务器后,AsyncUdpSocket接收数据的问题很小

时间:2011-04-26 12:16:24

标签: iphone sockets broadcast

我遇到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时,我没有得到数据。

知道我缺少什么吗?

4 个答案:

答案 0 :(得分:4)

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

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以进行进一步处理。

答案 1 :(得分:3)

您正在“连接”主机。根据{{​​3}},这意味着您只能获得源IP地址为255.255.255.255的UDP数据包。连接为UDP建立一对一关系,以便接收源地址与连接地址不同的接收数据包。

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

答案 2 :(得分: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];
}

答案 3 :(得分:0)

我可能完全疯了,但似乎这是iOS上AsyncUdpSocket的常见问题。

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

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