python和C语言混合编程实例


Posted in Python onJune 04, 2014

最近为了测试网速情况怎么样,由于部分业务服务器需要关闭icmp,这样的话采用普通的ping就无法适应我的需求,于是自己简单的写了一个基于tcp端口的ping的程序,由于c执行效率比较的不错,但是开发效率低下,而python是开发效率高,但是执行效率不如C,由于需要大规模的使用,于是用C实现核心部分的代码,并把这部分实现成一个python的模块,由python调用c的模块,下面就贴代码吧

/* tcpportping.c */
#include <Python.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/time.h>/* count time functions */
static double mytime(void)
{
    struct timeval tv;
    if (gettimeofday(&tv, NULL) == -1)
        return 0.0;
    return (double)tv.tv_usec + (double)tv.tv_sec * 1000000;
}
static PyObject *                                 /* returns object */
tcpping(PyObject *self, PyObject *args )
{
    struct  sockaddr_in addr;
    struct  hostent *hp;
    double  time;
    char    *host = NULL;
    int     fd;
    int     port, timeout;
    if (!PyArg_ParseTuple(args, "sii", &host, &port, &timeout))  /* convert Python -> C */
        return NULL;                              /* null=raise exception */
    if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        return Py_BuildValue("d", -1.0);        /* convert C -> Python */
    }
    bzero((char *)&addr, sizeof(addr));
    if ((hp = gethostbyname(host)) == NULL) {
        return Py_BuildValue("d", -2.0);        /* convert C -> Python */
    }
    bcopy(hp->h_addr, &addr.sin_addr, hp->h_length);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    struct timeval tv;
    tv.tv_sec = 0;
    tv.tv_usec = timeout * 1000;
    double stime = mytime();
    if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
        return Py_BuildValue("d", -3.0);        /* convert C -> Python */
    }
    fd_set read, write;
    FD_ZERO(&read);
    FD_ZERO(&write);
    FD_SET(fd, &read);
    FD_SET(fd, &write);
    if (select(fd + 1, &read, &write, NULL, &tv) == 0) {
        close(fd);
        return Py_BuildValue("d", -4.0);        /* convert C -> Python */
    }
    double etime = mytime();
    time = etime - stime;
    if (!FD_ISSET(fd, &read) && !FD_ISSET(fd, &write)) {
        close(fd);
        return Py_BuildValue("d", -4.0);        /* convert C -> Python */
    }
    close(fd);
    return Py_BuildValue("d", time/1000);        /* convert C -> Python */
}
/* registration table  */
static struct PyMethodDef portping_methods[] = {
    {"tcpping", tcpping, METH_VARARGS},       /* method name, C func ptr, always-tuple */
    {NULL, NULL}                   /* end of table marker */
};
/* module initializer */
void inittcpportping( )                       /* called on first import */
{                                      /* name matters if loaded dynamically */
    (void) Py_InitModule("tcpportping", portping_methods);   /* mod name, table ptr */
}

编译成python模块

gcc tcpportping.c  -I/usr/include/python2.4 -shared -L/usr/bin -fpic -lpython2.4 -o tcpportping.so

下面是python调用c模块的代码:

#!/usr/bin/env pythonimport tcpportping
import time
i = 0
while i < 5:
    t = tcpportping.tcpping('www.baidu.com', 80, 1000)
    if t < 0:
        print "time out"
    else:
        print t
    time.sleep(0.5)
    i += 1

执行python代码就可以实现端口ping的结果,从测试的情况来看,该程序执行的结果跟普通的ping几乎没有什么差别。
Python 相关文章推荐
Python正则表达式介绍
Aug 06 Python
python实现数据图表
Jul 29 Python
在python3环境下的Django中使用MySQL数据库的实例
Aug 29 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
Jan 29 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
Python实现手写一个类似django的web框架示例
Jul 20 Python
python中时间转换datetime和pd.to_datetime详析
Aug 11 Python
python实现的登录与提交表单数据功能示例
Sep 25 Python
Python实现元素等待代码实例
Nov 11 Python
Python之关于类变量的两种赋值区别详解
Mar 12 Python
Python unittest基本使用方法代码实例
Jun 29 Python
Python IO文件管理的具体使用
Mar 20 Python
python实现的一个p2p文件传输实例
Jun 04 #Python
python实现文件分组复制到不同目录的例子
Jun 04 #Python
python实现的udp协议Server和Client代码实例
Jun 04 #Python
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
Jun 04 #Python
Python程序员鲜为人知但你应该知道的17个问题
Jun 04 #Python
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
Jun 04 #Python
python控制台英汉汉英电子词典
Apr 23 #Python
You might like
PHP句法规则详解 入门学习
2011/11/09 PHP
学习使用curl采集curl使用方法
2012/01/11 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
PHP实现微信退款功能
2018/10/02 PHP
JavaScript 高级篇之函数 (四)
2012/04/07 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
JavaScript实现点击按钮就复制当前网址
2015/12/14 Javascript
Django1.7+JQuery+Ajax验证用户注册集成小例子
2017/04/08 jQuery
Vue项目中引入外部文件的方法(css、js、less)
2017/07/24 Javascript
Kindeditor单独调用多图上传实例
2017/07/31 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
微信小程序实现保存图片到相册功能
2018/11/30 Javascript
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
详解JavaScript之Array.reduce源码解读
2020/11/01 Javascript
Python运算符重载用法实例
2015/05/28 Python
python实现的简单RPG游戏流程实例
2015/06/28 Python
Python 实现一个颜色色值转换的小工具
2016/12/06 Python
Python设计模式之命令模式简单示例
2018/01/10 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
详解python之heapq模块及排序操作
2019/04/04 Python
Python当中的array数组对象实例详解
2019/06/12 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
你正在寻找的CSS3 动画技术
2011/07/27 HTML / CSS
建筑系毕业生自我鉴定
2014/01/24 职场文书
民族团结先进个人材料
2014/02/05 职场文书
入职担保书怎么写
2014/05/12 职场文书
心得体会的写法
2014/09/05 职场文书
综治工作心得体会
2014/09/11 职场文书
三严三实学习心得体会
2014/10/13 职场文书
2019年图书室自查报告范本
2019/10/12 职场文书
Java基础之this关键字的使用
2021/06/30 Java/Android
Python OpenCV超详细讲解基本功能
2022/04/02 Python