2012-03-25 40 views
0

送我使用这个库:https://github.com/robbiehanson/CocoaAsyncSocketUDP数据包没有在iPhone上

我的测试代码:

#import <UIKit/UIKit.h> 
@class GCDAsyncUdpSocket; 

@interface ThirdViewController : UIViewController 
{ 
    GCDAsyncUdpSocket *udpSocket; 
} 

.M:

#import "ThirdViewController.h" 
#import "DDLog.h" 
#import "DDTTYLogger.h" 
#import "GCDAsyncUdpSocket.h" 
static const int ddLogLevel = LOG_LEVEL_VERBOSE; 

@implementation ThirdViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [DDLog addLogger:[DDTTYLogger sharedInstance]]; 
    udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; 

    [udpSocket bindToPort:7744 error:nil]; 
    [udpSocket beginReceiving:nil]; 
    [udpSocket enableBroadcast:YES error:nil]; 
    //[udpSocket connectToHost:@"127.0.0.1" onPort:55544 error:nil]; 

    NSData *data = [@"test" dataUsingEncoding:NSUTF8StringEncoding]; 

    //[udpSocket sendData:data withTimeout:-1 tag:0]; 
    [udpSocket sendData:data toHost:@"127.0.0.1" port:55544 withTimeout:-1 tag:0]; 
} 

但不发送包。我使用这个数据包嗅探器:http://sourceforge.net/projects/packetpeeper/

在库中有一个客户端(Mac)的例子,我看到他的包。我试图在真实设备上运行应用程序,但也没有发送任何内容(地址当然是另一个)。问题是什么?

回答

1

您正在监听端口7744,并且您正在传送到端口55544。您应该将信息传输到您正在收听的相同端口。即发送应该是:

[udpSocket sendData:data toHost:@"127.0.0.1" port:7744 withTimeout:-1 tag:0]; 

受过教育的猜测,packetkeeper没有看到包的原因是因为他们不会出来的任何网络接口 - 它是为lo设备的包一般的优化(127.0.0.1 )不要在电线上出去;他们只是在当地环绕。大多数数据包拦截设备都无法检测到此类数据包。

编辑您至少需要两个GDCAsyncUdpSocket s - 一个用于客户端,一个用于服务器。最简单的方法是使用两个独立的应用程序,一个作为服务器运行,另一个作为客户端运行。

这ThirdViewController是某种形式的UDP客户端。当您发出bindToPort时,您需要使用端口号0,这会导致操作系统为此系统分配用于侦听的端口。如果您想要接收从服务器发送的数据包,则这是必需的。另外,我会经常检查bindToPort上的错误。

在服务器端,需要绑定到一个已知的端口:

[serverSocket bindToPort:55544 error:nil]; 

在客户端,当你发送你需要做的(对于仿真器)消息:

[udpSocket sendData:data toHost:@"127.0.0.1" port:55544 withTimeout:-1 tag:0]; 

在服务器端,当您收到didReceiveData处理程序中的消息时,您将通过fromAddress。该地址对应于从udpSocket的地址和端口,如果你想传递一个信息返回给客户端,你可以使用:

[serverSocket sendData:data toAddress:fromAddress withTimeout:-1 tag:0]; 

我有没有困难,从udpSocket和处理数据包发送到serverSocket当我遵循这个方法时,我的回应就是。我使用Mac端的wireshark来查看来自iDevice的数据包。当我使用模拟器时,我发送到127.0.0.1并在服务器上看到响应。

+0

感谢您的回答!我改变了监听端口的传输方式。我试图发送eth1,并且我没有看到该包。从我看到的mac应用程序发送的数据包,即使地址是127.0.0.1 – ifau 2012-03-25 16:23:04

+0

您如何确定要使用的'toHost'地址?您是否输入了屏幕上的iDevice的IP地址,因为除非您使用广播地址,否则这是您必须使用的地址 - 如果您的桌面在192.168.1.5上,则广播地址为192.168。 1.255'。您可以从“网络参数窗格”中确定您的桌面的IP地址。 – Petesh 2012-03-25 21:50:38

+0

我的电脑连接到路由器,地址为'192.168.10.101'。当我尝试从iDevice发送数据包时,我选择这个地址作为'toHost'。 IDevice的地址为'192.168.10.102'。当我尝试从模拟器发送时,我选择地址“127.0.0.1”。我也尝试选择'192.168.10.101'。 enableBroadcast我设置为'NO'。 – ifau 2012-03-26 06:59:08