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处理文本文件实现生成指定格式文件的方法
Jul 31 Python
Python性能优化的20条建议
Oct 25 Python
Python类属性与实例属性用法分析
May 09 Python
Djang中静态文件配置方法
Jul 30 Python
python 简单备份文件脚本v1.0的实例
Nov 06 Python
Python编程pygame模块实现移动的小车示例代码
Jan 03 Python
pyinstaller打包单个exe后无法执行错误的解决方法
Jun 21 Python
python控制台实现tab补全和清屏的例子
Aug 20 Python
Django自带的加密算法及加密模块详解
Dec 03 Python
三个python爬虫项目实例代码
Dec 28 Python
解决jupyter notebook显示不全出现框框或者乱码问题
Apr 09 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
Nov 26 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/04/17 PHP
php安全开发 添加随机字符串验证,防止伪造跨站请求
2013/02/14 PHP
PHP Global定义全局变量使用说明
2013/08/15 PHP
Php中使用Select 查询语句的实例
2014/02/19 PHP
JavaScript脚本语言在网页中的简单应用
2007/05/13 Javascript
jquery ajax 检测用户注册时用户名是否存在
2009/11/03 Javascript
javascript qq右下角滑出窗口 sheyMsg
2010/03/21 Javascript
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
jquery获取radio值实例
2014/10/16 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
详解javascript函数的参数
2015/11/10 Javascript
分享经典的JavaScript开发技巧
2015/11/21 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
2016/09/24 Javascript
AngularJS入门教程之Cookies读写操作示例
2016/11/02 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
Bootstrap响应式表格详解
2017/05/23 Javascript
解决Layui选择全部,换页checkbox复选框重新勾选的问题方法
2018/08/14 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
vue19 组建 Vue.extend component、组件模版、动态组件 的实例代码
2019/04/04 Javascript
jQuery动态生成的元素绑定事件操作实例分析
2019/05/04 jQuery
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
微信小程序实现点击导航条切换页面
2020/11/19 Javascript
[44:50]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 TNC vs VG
2018/04/02 DOTA
[00:48]DOTA2国际邀请赛公开赛报名开始 扫码开启逐梦之旅
2018/06/06 DOTA
python dict remove数组删除(del,pop)
2013/03/24 Python
Python脚本实现格式化css文件
2015/04/08 Python
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
Python模块的加载讲解
2019/01/15 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
2019/02/27 Python
python3实现网页版raspberry pi(树莓派)小车控制
2020/02/12 Python
Python 实现一个简单的web服务器
2021/01/03 Python
浅谈移动端网页图片预加载方案
2018/11/05 HTML / CSS
学习演讲稿范文
2014/05/10 职场文书
欠条格式范本
2015/07/03 职场文书
2016年6月份红领巾广播稿
2015/12/21 职场文书
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL