我对我的实际项目感到疯狂......
我有一台在特定端口上发送数据的设备。我的目标是在该端口上检测所有这类设备。 示例:我在同一个网络上有4种这样的设备,我会用iPhone检测所有这些设备。
它适用于JAVA发现工具,现在我正在尝试在我的iPhone上执行此操作。
JAVA发现工具中使用了以下步骤:
我尝试使用AsyncUdpSocket类重新生成相同的步骤:http://code.google.com/p/cocoaasyncsocket/
这是我到目前为止尝试的代码:
NSError *e;
NSString *d = @"abcd";
NSData *data = [d dataUsingEncoding:NSUTF8StringEncoding];
ssocket = [[AsyncUdpSocket alloc]initWithDelegate:self];
[ssocket setDelegate:self];
[ssocket enableBroadcast:YES error:&e];
[ssocket connectToHost:@"255.255.255.255" onPort:30303 error:&e];
[ssocket sendData:data withTimeout:-1 tag:0];
[ssocket receiveWithTimeout:-1 tag:0];
委托- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port
永远不会被调用......
我不知道有什么问题。你能否就这个问题向我发表意见?如果我使用正确的方法,看看我做错了什么?
提前谢谢!!
MoKeS
编辑:
我使用wireshark通过JavaDiscoverTool和我的应用程序来嗅探网络流量。 事实上,2个数据包(iphone和javadiscovertool)之间的差异是源端口。 实际上,在我的应用程序中,源端口与目标端口不同,我认为这会导致问题。 我需要找到一种方法来强制我发送的数据包上的源端口......
有什么想法吗?它位于AsyncUdpSocket类上。
答案 0 :(得分:0)
我找到了解决方案。
使用:
NSError *e;
NSString *d = @"Discovery: Who is out there?\0\n";
NSData *data = [d dataUsingEncoding:NSUTF8StringEncoding];
ssocket = [[AsyncUdpSocket alloc]initWithDelegate:self];
[ssocket setDelegate:self];
[ssocket bindToPort:PORT error:&e];
[ssocket enableBroadcast:YES error:&e];
//[ssocket connectToHost:@"255.255.255.255" onPort:30303 error:&e];
//[ssocket sendData:data withTimeout:-1 tag:0];
[ssocket sendData:data toHost:@"255.255.255.255" port:30303 withTimeout:-1 tag:0];
[ssocket receiveWithTimeout:-1 tag:0];
代表:
- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port
{
NSString* aStr;
aStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"didreceivedata : %@", aStr);
return NO;
}