2009-11-23 138 views
0

我使用sendto()recvfrom()通過WiFI發送一些簡單的數據包通過UDP。iphone問題接收UDP數據包

我使用兩部手機,以及一個模擬器試過,我得到的結果是:

數據包從手機發送 - >通過模擬器 報文發送模擬器收到 - >模擬器recvfrom的仍然封鎖。 從手機發送的數據包 - >其他手機recvfrom仍然阻塞。

我不知道如何開始調試這一個,因爲模擬器/ MAC能夠接收數據包,但手機似乎沒有得到消息。

稍微放一邊,我需要保持我的數據包低於我的網絡的MTU?還是由操作系統或其他一些較低級別的軟件處理碎片?

更新: 我忘了包括數據包大小和結構。我發送:

typedef struct PacketForTransmission { 
    int32_t packetTypeIdentifier; 
    char data[64]; // size to fit my biggest struct 
} PacketForTransmission; 

其中char數據[64]爲:

typedef struct PacketHeader{ 
    uint32_t identifier; 
    uint32_t datatype; 
} PacketHeader; 

typedef struct BasePacket{ 
    PacketHeader header; 
    int32_t cardValue; 
    char sendingDeviceID[41]; //dont forget to save room for the NULL terminator! 
} BasePacket; 

typedef struct PositionPacket{ 
    BasePacket basePacket; 
    int32_t x; 
    int32_t y; 
} PositionPacket; 

發送的分組是這樣的:

PositionPacket packet; 
bzero(&packet, sizeof(packet)); 
//fill packet with it's associated data 

PacketForTransmission transmissionPacket; 
transmissionPacket.packetTypeIdentifier = kPositionPacketType; 
memcpy(&transmissionPacket.data, (void*)&packet, sizeof(packet)); //put the PositionPacket into data[64] 

size_t sendResult = sendto(_socket, &transmissionPacket, sizeof(transmissionPacket), 0, [address bytes], [address length]); 
NSLog(@"packet sent of size: %i", sendResult); 

和recieving分組是這樣的:

while(1){ 
    char dataBuffer[8192]; 
     struct sockaddr addr; 
    socklen_t socklen = sizeof(addr); 
    ssize_t len = recvfrom(_socket, dataBuffer, sizeof(dataBuffer), 0, &addr, &socklen); //continues blocking here 
     NSLog(@"packet recieved of length: %i", len); 

    //do some more stuff 
} 
+1

請發佈代碼。 –

+0

有關您正在使用哪個端口的任何信息? –

+0

我使用bonjour,所以端口是「任何可用的端口」 – SooDesuNe

回答

0

我不認爲你可以接收而不讓操作系統知道您正在監聽的端口。通常將傳入數據包的端口號與進程綁定的端口號進行比較,以確定數據包需要傳送到何處。

嘗試建立一個固定的端口號(只需選擇一個隨機的16位無符號整數,如49153或其他),並在兩側使用。

您提到使用Bonjour,據我瞭解,它允許動態發現網絡資源,但我認爲這值得嘗試。