在XCode 6中找不到sockaddr_in(在OS X 10.10 Yosemite上)
问题描述:
我正尝试从目标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
有没有人碰到这个问题来了?
编辑:没有认识到的东西,在<>括号中不显示
答
见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)等)。
答
Xcode 6需要完整的数据类型定义。不是“sockaddr_in
”,而是“struct sockaddr_in
”。 “const sockaddr*
”必须是“const struct sockaddr*
”。
您是否还安装了Xcode命令行工具?如果不是,'/ usr/include'中可能没有头文件。尝试运行'xcode-select --install' – 2014-11-14 18:07:47
显示所有包含文件。 – *foe 2014-11-14 18:11:36
@NedDeily是的,我有CL工具安装,我试图运行该命令,以防万一,没有运气。 – andrei 2014-11-14 19:18:43