UDP数据包不会在iPhone上发送

时间:2012-03-25 15:13:51

标签: objective-c ios sockets udp asyncsocket

我使用此库:https://github.com/robbiehanson/CocoaAsyncSocket

我的测试代码:

#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 个答案:

答案 0 :(得分:1)

您正在侦听端口7744,并且您正在向端口55544进行传输。您应该正在传输到您正在收听的同一个端口。即发送应该是:

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

有关分组管理员没有看到数据包的原因的一个有根据的猜测是因为它们没有出去任何网络接口 - 这是lo设备(127.0.0.1)的数据包的一般优化不要出线;他们只是在当地环绕。大多数数据包拦截设备都无法检测到这种类型的数据包。

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

这个ThirdViewController是某种形式的UDP客户端。当您发出bindToPort时,您需要使用端口号0,这会导致操作系统为此系统分配一个用于侦听的端口。如果您想要接收从服务器发送的数据包,则需要这样做。

[udpSocket bindToPort:0 error:nil];

除此之外,我总是会检查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];

我从serverSocketudpSocket发送数据包并按照此方法处理响应时没有遇到任何困难。我在Mac端使用wireshark来查看来自iDevice的数据包。当我使用模拟器时,我发送到127.0.0.1并在服务器上看到了响应。