python 向C接口传递结构体数组、结构体

c源码 1.c

#include <stdio.h>
#include <string.h>
#include "1.h"


int add(int a, int b)
{
    return a+b;
}
#if 0
int add_stus(STUDENT *data, int count)
{
    int i = 0;
    printf("count=[%d]\n",count);
    for (i; i < count; i++)
    {
            printf("age=%d\n", data->age);
            printf("name=%s\n", data->name);
            printf("color=%s\n", data->color);
            printf("alarmtime=%ld\n", data->alarmtime);
    }

    return 1;
}

int add_stu(STUDENT *data)
{
    printf("age=%d\n", data->age);
    printf("name=%s\n", data->name);
    printf("color=%s\n", data->color);
    printf("alarmtime=%ld\n", data->alarmtime);
    return 1;
}

int add_data(STUDENT data)
{
    printf("age=%d\n", data.age);
    printf("name=%s\n", data.name);
    printf("color=%s\n", data.color);
    printf("alarmtime=%ld\n", data.alarmtime);
    return 1;
}
#endif

int add_stus(STUDENT *data, int count)
{
    int i = 0;
    printf("count=[%d]\n",count);
    for (i; i < count; i++)
    {
            printf("rtype=%d\n", data->rtype);
            printf("msgdata=%s\n", data->msgdata);
            printf("srcip=%s\n", data->srcip);
            printf("alarmtime=%ld\n", data->alarmtime);
    }

    return 1;
}

int add_stu(STUDENT *data)
{
    printf("rtype=%d\n", data->rtype);
    printf("msgdata=%s\n", data->msgdata);
    printf("srcip=%s\n", data->srcip);
    printf("alarmtime=%ld\n", data->alarmtime);
    return 1;
}

int add_data(STUDENT data)
{
    printf("rtype=%d\n", data.rtype);
    printf("msgdata=%s\n", data.msgdata);
    printf("srcip=%s\n", data.srcip);
    printf("alarmtime=%ld\n", data.alarmtime);
    return 1;
}

#if 0
int main()
{
    STUDENT st;
    memset((void*)&st, 0, sizeof(st));
    st.rtype = 1;
    st.alarmtime = time(NULL);
    strcpy(st.srcip , "xiaoqing");

    add_data(st);
    add_stu(&st);
}
#endif

头文件1.h

#ifndef _1_H_
#define _1_H_

#include <time.h>
#if 0
typedef struct _tag_st{
    int age;
    char name[12];
    char color[12];
    time_t alarmtime;
    int hi;
}STUDENT;
#endif 
typedef enum{
    LK_ALARM_TYPE_IP = 1,
    LK_ALARM_TYPE_DOMAIN,
    LK_ALARM_TYPE_URL,
    LK_ALARM_TYPE_FHASH,
    LK_ALARM_TYPE_MAX
}ALARM_TYPE_E;
typedef struct tag_threat_rawdata{
    int rtype;             // 请求类型
    time_t alarmtime;               // 威胁事件发生时间
    char msgdata[128];              // 检测信息

    char srcip[48];                 // 源IP
    char dstip[48];                 // 目的IP
    char trans_proto[8];            // 传输层协议
    char app_proto[16];             // 应用层协议
    short sport;                    // 源端口
    short dport;                    // 目的端口
    int flag;                       //元素读、写标志,0-可写,1-可读
}STUDENT;

int add(int a, int b);
int add_stu(STUDENT *data);
int add_stus(STUDENT *data, int count);
int add_data(STUDENT data);
#endif

生成动态库

$ gcc 1.c -fPIC -shared -o libmystu.so

注意:一定要用gcc编译,python调用c/c++接口只支持gcc生成的动态库

python 源码

#!/usr/bin/python3.4
# -*- coding:utf-8 -*-

from ctypes import *
import time
import sys
import os

dll = cdll.LoadLibrary("./libmystu.so") #加载动态库

LK_ALARM_TYPE_IP=1
LK_ALARM_TYPE_DOMAIN=2
LK_ALARM_TYPE_URL=3
LK_ALARM_TYPE_FHASH=4

#定义结构体
class ThreatClass(Structure):  
       _fields_ = [
            ("rtype", c_int),
            ("alarmtime", c_long),
            ("msgdata", c_char * 128),
            ("srcip", c_char * 48),
            ("dstip", c_char * 48),
            ("trans_proto", c_char * 8),
            ("app_proto", c_char * 16),
            ("sport", c_short),
            ("dport", c_short),
            ("flag", c_int)
      ]


def add_threat(array, count):
    try:
        if count <= 0:
            return 

        entrylist = []
        i = 0
        for data in array:
            threat = ThreatClass()
           
            threat.rtype = data["rtype"]
            threat.alarmtime = data["alarmtime"] 
            threat.msgdata = bytes(data["msgdata"].encode())
            threat.srcip = bytes(data["srcip"].encode())
            threat.dstip = bytes(data["dstip"].encode())
            threat.trans_proto = bytes(data["trans_proto"].encode())
            threat.app_proto = bytes(data["app_proto"].encode())
            threat.sport = data["sport"]
            threat.dport = data["dport"]
            threat.flag = 0

            #dll.add_stu.argtype = POINTER(ThreatClass)
            #dll.add_stu.restype = c_int
            #ret = dll.add_stu(byref(threat))
            #entrylist.append(threat)

            i = i+1

        #定义结构体数组,批量插入
        ThreatArray = (ThreatClass * i)(*entrylist)
        dll.add_stus.argtypes = (POINTER(ThreatClass), c_int) #指定C接口的参数类型,List格式
        dll.add_stus.restype = c_int  #指定C接口的返回值类型
        ret = dll.add_stus(ThreatArray, i)
        print(ret)
        
    except Exception as err:
        print(err)
        
if __name__ == '__main__':
    arrary = []
    data = {}
    data["alarmtime"] = int(time.time())
    data["msgdata"] = "1.1.1.56"
    data["srcip"] = "172.16.110.10"
    data["dstip"] = "172.16.110.11"
    data["trans_proto"] = "tcp"
    data["app_proto"] = "http"
    data["sport"] = 1204
    data["dport"] = 1205
    data["rtype"] = LK_ALARM_TYPE_IP
    arrary.append(data)

    da = {}
    da["alarmtime"] = int(time.time())
    da["msgdata"] = "9.9.9.9"
    da["srcip"] = "172.16.110.10"
    da["dstip"] = "172.16.110.11"
    da["trans_proto"] = "tcp"
    da["app_proto"] = "http"
    da["sport"] = 1204
    da["dport"] = 1205
    da["rtype"] = LK_ALARM_TYPE_IP
    arrary.append(da)

    add_threat(arrary, 2)    

注意:1. python 定义的结构体顺序一定要与C定义的结构体顺序一致

           2. python 定义的结构体中的数组元素的长度要与C结构体中的数组长度一致,保持对齐

           3. 字符数组要如此处理,bytes(data["srcip"].encode())再传递

           4. 结构体数组的定义要 ThreatArray = (ThreatClass * i)(*entrylist), entrylist是列表,存储对象

           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值