2010-04-28 57 views
2

我試圖通過Wi-Fi在MAC OS和iPod之間建立UDP通信,此時我可以從iPod發送數據包,並且我可以看到這些數據包有權MAC和IP地址(我使用wireshark監視網絡),但MAC只在wireshark打開時接收數據包,否則recvfrom()返回-1。在iPhone上收回UDP數據包

當我嘗試從MAC傳輸到iPhone我有相同的結果,我可以看到數據包發送,但iPhone似乎並沒有得到它們。

我用下面的代碼來發送:

struct addrinfo hints; 
int rv; 

memset(&hints, 0, sizeof hints); 
hints.ai_family = AF_UNSPEC; 
hints.ai_socktype = SOCK_DGRAM; 

if ((rv = getaddrinfo(IP, SERVERPORT, &hints, &servinfo)) != 0) { 
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
    return 1; 
} 
// loop through all the results and make a socket 
for(p = servinfo; p != NULL; p = p->ai_next) { 
    if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { 
    perror("talker: socket"); 
    continue; 
    } 
    break; 
} 

if (p == NULL) { 
    fprintf(stderr, "talker: failed to bind socket\n"); 
    return 2; 
} 
while (cond) 
    sntBytes += sendto(sockfd, message, strlen(message), 0, p->ai_addr, p->ai_addrlen); 
return 0; 

這個代碼,即可獲得:

struct addrinfo hints, *p; 
int rv; 

memset(&hints, 0, sizeof hints); 
hints.ai_family = AF_UNSPEC; // set 
hints.ai_socktype = SOCK_DGRAM; 
hints.ai_flags = AI_PASSIVE; // use to AF_INET to force IPv4 my IP 

if ((rv = getaddrinfo(NULL, MYPORT, &hints, &servinfo)) != 0) { 
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
    return 1; 
} 
// loop through all the results and bind to the first we can 
for(p = servinfo; p != NULL; p = p->ai_next) { 
    if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { 
    perror("listener: socket"); 
    continue; 
    } 


    if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) { 
    close(sockfd); 
    perror("listener: bind"); 
    continue; 
    } 

    break; 
} 

if (p == NULL) { 
    fprintf(stderr, "listener: failed to bind socket\n"); 
    return 2; 
} 

addr_len = sizeof their_addr; 
fcntl(sockfd, F_SETFL,O_NONBLOCK); 

int rcvbuf_size = 128 * 1024; // That's 128Kb of buffer space. 
setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, 
     &rcvbuf_size, sizeof(rcvbuf_size)); 

printf("listener: waiting to recvfrom...\n"); 

while (cond) 
    rcvBytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0, (struct sockaddr *)&their_addr, &addr_len); 

return 0; 

我缺少什麼?

+1

請確保您的代碼已正確插入您的帖子中(使用您可以在發佈帖子時可以選擇的特殊代碼按鈕),現在沒有人可以閱讀它了^^「 – Bas 2010-04-28 14:42:57

+0

雖然試圖將上述內容變爲好-formatted SO標記,我注意到最後一條if語句(「if(setsockopt(...」))格式不正確。它缺少至少一個「)」。 – 2010-04-28 15:11:22

+0

你試圖發送多少個字節?你也試圖發送一個ASCII字符串或文件? – 2010-04-29 06:13:17

回答

1

這將是很好的獲得關於您發送的數據的長度的更多信息。 我會假設你正試圖發送一個ASCII string

而且,這似乎是要麼從來沒有所謂的或無限發送循環:

while (cond) 
    sntBytes += sendto(sockfd, message, strlen(message), 0, p->ai_addr, p->ai_addrlen); 

你可能想使用代碼,實際上包括了一些錯誤檢查:

發送字符串

int sendResult = send(connectedSocket, stringBuffer, stringLength, 0); 
    if (sendResult == -1) { 
     perror("Error while trying to send string!"); 
    } 
    else { 
     NSLog(@"String '%s' sent successfully", stringBuffer); 
    } 

接收字符串

memset(ReceiveBuffer, '\0', sizeof(ReceiveBuffer)); 
    int receiveResult = recv(connectedSocket, ReceiveBuffer, sizeof(ReceiveBuffer), 0); 
    if (receiveResult == -1) { 
     perror("recv"); 
    } 
    else { 
     NSLog(@"String received successfully: '%s'", ReceiveBuffer); 
    } 
+0

謝謝你的迴應。這些循環僅用於演示實際代碼中的發送命令,我正在使用定時器每隔0.1秒發送/接收一個數據包。至於我要發送的數據,現在它是ASCII字符串,但最終它會是RTP數據包。 – Eli 2010-04-29 07:48:34

+0

您需要特定代碼的幫助,但在其位置顯示僞代碼?荒謬! – 2010-05-02 12:05:24