2014-11-14 83 views
1

我正嘗試從目標c應用發送UDP數據包。從OS X 10.6開始,直到優勝美地出現爲止,它一直在正常工作。現在我收到「未知類型名稱'sockaddr_in'」錯誤。在XCode 6中找不到sockaddr_in(在OS X 10.10 Yosemite上)

我的代碼:

#import <sys/socket.h> 
-(void)sendUdpPacket:(unsigned int) udp_address port:(unsigned short)port data:(const char*)data dataSize:(long)dataSize 
{ 
    int handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 

    if (handle <= -1) 
    { 
     return; 
    } 

    sockaddr_in address; 
    address.sin_family = AF_INET; 
    address.sin_addr.s_addr = htonl(udp_address); 

    address.sin_port = htons(port); 
    if (bind(handle, (const sockaddr*) &address, sizeof(sockaddr_in)) < -1) 
    { 
     printf("-----------------------failed to bind socket\n "); 
     return; 
    } 
    int nonBlocking = 1; 
    if (fcntl(handle, F_SETFL, O_NONBLOCK, nonBlocking) == -1) 
    { 
     printf("----------------------failed to set non-blocking socket for %d\n", port); 
     return; 
    } 

    int sent_bytes = sendto(handle, data, dataSize, 0, (sockaddr*)&address, sizeof(sockaddr_in)); 
    close(handle); 
} 

現在我得到的錯誤,它無法找到IPROTO_UDP or sockaddr_in

有沒有人碰到這個問題來了?

編輯:沒有認識到的東西,在<>括號中不顯示

+0

您是否還安裝了Xcode命令行工具?如果不是,'/ usr/include'中可能沒有頭文件。嘗試運行'xcode-select --install' – 2014-11-14 18:07:47

+0

顯示所有包含文件。 – trojanfoe 2014-11-14 18:11:36

+0

@NedDeily是的,我有CL工具安裝,我試圖運行該命令,以防萬一,沒有運氣。 – andrei 2014-11-14 19:18:43

回答

3

inet(4) man page。您必須:

#include <sys/types.h> 
#include <netinet/in.h> 

通常,套接字接口是通用的。它可以用於不同的地址系列。 struct sockaddr是一般形式,而sockaddr_in是特定於IPv4的。您將使用作爲IPv6地址。對於Unix域套接字,您可以使用sockaddr_un。等等您需要查看您想要使用的插座類型的手冊頁(例如inet6(4),unix(4)等)。

0

Xcode 6需要完整的數據類型定義。不是「sockaddr_in」,而是「struct sockaddr_in」。 「const sockaddr*」必須是「const struct sockaddr*」。

相關問題