- 论坛徽章:
- 0
|
linux_c_py_php 发表于 2012-11-16 11:38 ![]()
可以指定第三个参数hint进行过滤, 只返回希望得到的结果, 自己manpage一下.
如果是local link(应该是同一 ...
hi
试了一下使用getaddrinfo这个函数,bind还是失败,解析了一下它的res出参,scope_id还是为0,如果是手动强制把这个值赋值,就没有问题:
写了个小的测试程序,代码如下:
#include <iostream>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <ifaddrs.h>
#include <sys/ioctl.h>
#include <net/if.h>
using namespace std;
int main() {
int res,sock,s,inInterfaces;
struct sockaddr_in6 *ip6_addr;
struct sockaddr *addr;
struct in6_addr in6;
char *addrStr = "fe80::20c:29ff:fe80:97d2";
char *addrStr2 = "fe80::20c:29ff:fe80:97dc";
int port =5060;
struct ifaddrs *ifaddr;
int ifindex = 0;
sock = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
if (sock < 0)
{
printf("creat sock err[%d]\r\n",errno);
}
ip6_addr = (sockaddr_in6 *)malloc(sizeof(struct sockaddr_in6));
memset(ip6_addr,0,sizeof(struct sockaddr_in6));
inet_pton(AF_INET6, addrStr, &in6);
ip6_addr->sin6_family = AF_INET6;
addr = (sockaddr *)malloc(sizeof(struct sockaddr));
memset(addr,0,sizeof(struct sockaddr));
memcpy(&ip6_addr->sin6_addr,
&in6,sizeof(struct in6_addr));
struct addrinfo hints, *result, *p;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET6;
hints.ai_protocol = IPPROTO_UDP;
hints.ai_flags = AI_PASSIVE;
res = getaddrinfo(addrStr, "5060", &hints,&result);
if (res != 0)
{
printf("getaddrinfo err[%d] res[%d]!!!\r\n",errno,res );
}
else
{
printf("getaddrinfo ok!!!\r\n" );
}
p = result;
while (p != NULL)
{
ifindex = ((sockaddr_in6 *)p->ai_addr)->sin6_scope_id;
printf("ifindex[%d]\r\n",ifindex); //这里输出始终为0
printf("port[%d]\r\n",htons(((sockaddr_in6 *)p->ai_addr)->sin6_port));
p = p->ai_next;
}
//ip6_addr->sin6_scope_id = 2;
//ip6_addr->sin6_port = htons(port);
//addr = (struct sockaddr *) ip6_addr;
//res = bind(sock, addr, sizeof(struct sockaddr_in6));
//((struct sockaddr_in6 *) result->ai_addr)->sin6_scope_id = 2; //如果设置了这个,就能绑定成功
res = bind(sock, result->ai_addr, result->ai_addrlen);
if (res != 0)
{
printf("bind socket err[%d] res[%d] ai_addrlen[%d]!!!\r\n",errno,res,result->ai_addrlen );
}
else
{
printf("bind socket ok!!!\r\n" );
}
return 0;
}
|
|