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下载FTP上的文件夹的实现代码
Feb 10 Python
Python中字典创建、遍历、添加等实用操作技巧合集
Jun 02 Python
python使用opencv读取图片的实例
Aug 17 Python
Python实现识别手写数字 Python图片读入与处理
Mar 23 Python
Python对List中的元素排序的方法
Apr 01 Python
python 实现矩阵上下/左右翻转,转置的示例
Jan 23 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 Python
解决python -m pip install --upgrade pip 升级不成功问题
Mar 05 Python
详解用Python爬虫获取百度企业信用中企业基本信息
Jul 02 Python
Keras实现DenseNet结构操作
Jul 06 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
python 用递归实现通用爬虫解析器
Apr 16 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
Look And Say 序列php实现代码
2011/05/22 PHP
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
将string解析为json的几种方式小结
2010/11/11 Javascript
Js sort排序使用方法
2011/10/17 Javascript
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
2015/06/05 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
jquery马赛克拼接翻转效果代码分享
2015/08/24 Javascript
js+css实现超简洁的二级下拉菜单效果代码
2015/09/07 Javascript
jquery插入兄弟节点的操作方法
2016/12/07 Javascript
简单好用的nodejs 爬虫框架分享
2017/03/26 NodeJs
JavaScript实现省市县三级级联特效
2017/05/16 Javascript
vue mint-ui tabbar变组件使用
2018/05/04 Javascript
Vue+element-ui 实现表格的分页功能示例
2018/08/18 Javascript
javascript function(函数类型)使用与注意事项小结
2019/06/10 Javascript
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
python修改操作系统时间的方法
2015/05/18 Python
django接入新浪微博OAuth的方法
2015/06/29 Python
深入理解python对json的操作总结
2017/01/05 Python
python 换位密码算法的实例详解
2017/07/19 Python
python操作oracle的完整教程分享
2018/01/30 Python
django admin组件使用方法详解
2019/07/19 Python
Anaconda+Pycharm环境下的PyTorch配置方法
2020/03/13 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
2020/05/29 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
浅谈Python 钉钉报警必备知识系统讲解
2020/08/17 Python
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
机械工程师求职自我评价
2013/09/23 职场文书
渡河少年教学反思
2014/02/12 职场文书
代理人委托书
2014/08/01 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
怎样写辞职信
2015/02/27 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
中国古风插画师排行榜:夏达第一,第三是阴阳师姑获鸟皮肤创作者
2022/03/18 国漫