如何在iPhone ios4.2上的特定端口上收听?

时间:2011-02-16 10:51:24

标签: iphone sockets networking ios-4.2 listen

我对我的实际项目感到疯狂......

我有一台在特定端口上发送数据的设备。我的目标是在该端口上检测所有这类设备。 示例:我在同一个网络上有4种这样的设备,我会用iPhone检测所有这些设备。

它适用于JAVA发现工具,现在我正在尝试在我的iPhone上执行此操作。

JAVA发现工具中使用了以下步骤:

  • 创建DatagramSocket(JAVA)
  • 获取广播地址(255.255.255.255)
  • 创建DatagramPacket(JAVA)
  • 使用端口30303
  • 在广播地址上发送数据包
  • 进入接收模式
  • 由于套接字,它会获得答案数据包
  • 从设备中提取ip和主机名

我尝试使用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类上。

1 个答案:

答案 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;


}