将Ip Address转换为int(in_addr)以进行SWIG绑定

时间:2014-11-10 12:19:04

标签: sockets python-2.7 swig

我在python中为一些c ipset代码构建了一个SWIF接口(来自DnsMasq)

它有两个大问题,ip地址向后插入IpSet! 即127.0.0.1变为1.0.0.127并且当我将s_addr设置为转换后的ips大约为192.x.x.x及更高时,swig错误... 我玩过endianess,但是当我这样做,或者当我使用高IP地址时,我得到了

  

in method' in_addr_s_addr_set',参数2类型' int'

这是我的SWIG界面

    %module ipset
%{
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/utsname.h>
#include <arpa/inet.h>
#include <linux/version.h>
#include <linux/netlink.h>   


extern void ipset_init(void);
int add_to_ipset(const char *setname, const struct in_addr *ipaddr, int flags, int remove);
 %}


struct in_addr {
            int s_addr;
};

extern void ipset_init(void);
int add_to_ipset(const char *setname, const struct in_addr *ipaddr, int flags, int remove);

这是我的python

ina = ipset.in_addr()
aton = socket.inet_aton(ip)
sa = struct.unpack("!L",aton)[0]
ina.s_addr = sa
ipset.add_to_ipset("ipset-name", ina, socket.AF_INET, 0)

1 个答案:

答案 0 :(得分:0)

要修复SWIG绑定,我需要一个unsigned long

struct in_addr {
    unsigned long s_addr;
};

仍然不确定原因,但为了修复逆转我需要将整数解包为小端。

sa = struct.unpack("<L",aton)[0]