C语言中的Socket - 权限被拒绝

3

我正在尝试从DNS服务器中获取MX记录的C代码。但每次调用sendto和recvfrom时,都会出现拒绝访问的错误。(IDE-Xcode 4,Mac OS X Lion)。直到现在我还没有在C语言方面做过什么,但这是我的一项任务要求。参考http://www.binarytides.com/blog/dns-query-code-in-c-with-linux-sockets/,我的目前代码如下:

struct QUESTION
{
unsigned short qtype;
unsigned short qclass;
};

typedef struct
{
unsigned char *name;
struct QUESTION *ques;
} QUERY;

typedef struct
{
unsigned short type;
unsigned short _class;
unsigned int ttl;
unsigned short data_len;
} R_DATA;



int main(int argc, char *argv[]) 
{ 



int sockfd, i;
unsigned char buf[65536],*qname;
struct QUESTION *qinfo = NULL;

struct sockaddr_in dest;

struct dnsheader *dns = NULL;

sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);


dest.sin_family=AF_INET;
dest.sin_port=htons(53);
dest.sin_addr.s_addr= inet_addr("ns1.sil.at");


srand((unsigned)time(NULL)); 
int16_t rand_number = (rand()%1000+1);
printf("generated random number : %i \n", rand_number);


dns = (struct dnsheader *)&buf;
dns->flags = STANDARD_QUERY_FLAGS;
dns->question_count = 1;
dns->transaction_id = rand_number;
dns->answer_rr_count = 0;
dns->additional_rr_count = 0;
dns->nameserver_rr_count = 0;


qname =(unsigned char*)&buf[sizeof(struct dnsheader)];


qinfo =(struct QUESTION*)&buf[sizeof(struct dnsheader) + (strlen((const char*)qname) + 1)]; //fill it

qinfo->qtype = htons( 15 ); // MX = 15
qinfo->qclass = htons(1); 

printf("\nSending Packet...");
if( sendto(sockfd,(char*)buf,sizeof(struct dnsheader) + (strlen((const char*)qname)+1) + sizeof(struct QUESTION),0,(struct sockaddr*)&dest,sizeof(dest)) < 0){
    perror("\nsendto failed");
}
printf("\nDone\n");


i = sizeof dest;
printf("\nReceiving answer...");
if(recvfrom (sockfd,(char*)buf , 65536 , 0 , (struct sockaddr*)&dest , (socklen_t*)&i ) < 0){
    perror("recvfrom failed");
}
printf("Done");

dns = (struct dnsheader*) buf;

print_dns_answers(buf, sizeof((char*)buf));




close(sockfd); 


return 0; 
} 

你的代码无法编译。然而,作为一个经验法则,你检查了防火墙吗?目标是否可访问? - cateof
2个回答

8
< p > inet_addr 函数接收字符串形式的 IP 地址,而不是主机名。请将 "ns1.sil.at" 替换为其 IP 地址 "213.129.232.1"


2
这很可能意味着inet_addr()返回-1,这将被解释为IP地址255.255.255.255,并且很可能OSX拒绝普通用户发送到广播地址(或者至少要求您首先设置SO_BROADCAST套接字选项)。 - nos
1
试图使用主机名而不是IP根本没有意义。即使它能够工作,这也意味着DNS客户端依赖于DNS才能进行查询... - ugoren

0
除了 @joni-salonen 的答案,你需要绑定 socket。
使用 bind 函数调用。
它需要一个 struct sockaddr_in,用于标识套接字的本地端。你可以使用地址族为 AF_INET、端口为 0 和地址为 INADDR_ANY 初始化它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接