2014-11-14 144 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*”。

相关问题