2012-03-25 68 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