3.1
因为不同类型的套接字长度不同。IPV4和IPV6套接字长度固定,但Unix域结构和数据链路结构是可变长度的,需要一个参数记录结果的大小,直接传就是值传递了,需要传一个指针,以实现引用传递。
3.2
void指针只能用来传参数,不能对void类型指针加减和解引用
3.3
匆匆忙忙按自己的理解写了下, 也不知道对不对。。先这样吧
#include "../lib/unp.h"
#include <string.h>
int inet_pton_loose(int family, const char* strptr, void* addrptr){
if(family==AF_INET){
int res;
if((res=inet_pton(family, strptr, addrptr)<=0)){
printf("inet_pton failed, IPV4 address is %s\n",strptr);
struct in_addr inaddr;
if(inet_aton(strptr, &inaddr)){
memcpy(addrptr, &inaddr, sizeof(struct in_addr));
return 1;
}
return 0;
}
return 1;
}
else if(family==AF_INET6){
int res;
if((res=inet_pton(family, strptr, addrptr)<=0)){
printf("inet_pton failed, IPV4 address is %s\n",strptr);
struct in_addr inaddr;
if(inet_aton(strptr, &inaddr)){
memcpy(addrptr, &inaddr, sizeof(struct in_addr));
return 1;
}
return 0;
}
return 1;
}
return 0;
}
int main(int argc, char** argv){
if(argc<3){
printf("input format: ./main <family> <address>\n");
return 1;
}
in_addr_t addr;
bzero(&addr,sizeof(in_addr_t));
int res;
if(strcmp(argv[1],"AF_INET")==0){
printf("IPV4 used: convert is preparing\n");
res=inet_pton_loose(AF_INET,argv[2],(void*)&addr);
}
else if(strcmp(argv[1],"AF_INET6")==0){
printf("IPV6 used: convert is preparing\n");
res=inet_pton_loose(AF_INET6,argv[2],(void*)&addr);
}
printf("%d %08x\n",res,addr);
return 0;
}