转载自:http://www.jb51.net/article/50633.htm

这篇文章主要介绍了python和C语言混合编程实例,文中开发了一个tcp端口ping程序来介绍混合编程,需要的朋友可以参考下。

最近为了测试网速情况怎么样,由于部分业务服务器需要关闭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 timei = 0
while i < 5:t = tcpportping.tcpping('www.baidu.com', 80, 1000)if t < 0:print "time out"else:print ttime.sleep(0.5)i += 1

执行python代码就可以实现端口ping的结果,从测试的情况来看,该程序执行的结果跟普通的ping几乎没有什么差别。

python和C语言混合编程实例相关推荐

  1. python和c语言混合编程-python和C语言混编的几种方式

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7594551.html 作者:窗户 Q ...

  2. python与c语言混合编程_python和C语言混编的几种方式

    Python这些年风头一直很盛,占据了很多领域的位置,Web.大数据.人工智能.运维均有它的身影,甚至图形界面做的也很顺,乃至full-stack这个词语刚出来的时候,似乎就是为了描述它. Pytho ...

  3. python和其它语言混合编程_5种语言混合编程:C++、JS、python、Lisp、汇编

    /* 混合C++.JS.python.Lisp.汇编 1种语言,5种语法 */ main { //C++ vector v; v.push(2); putsl(v.size()); if(v.coun ...

  4. ARM汇编和C语言混合编程中数组的数组的操作

    ARM汇编和C语言混合编程中数组的数组的操作 此示例描述a数组中的元素累加的结果,c和b交换的实例: 代码块 例如: #include <stdio.h>int main (int arg ...

  5. jvm字节码和基于jvm的多语言混合编程

    字节码 IT领域的三大难题 CPU OS 编译器 多语言混合编程 如何搞懂jvm <自己动手写java虚拟机>作者使用的是go语言,比较投机取巧,因为go语言有比较完整的垃圾回收机制,如果 ...

  6. c语言编程经典实例利润,C语言经典编程实例100题解答

    C语言经典编程实例100题 答案+答案 C语言经典编程实例100题C语言程序实例100个(一) [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数,都是多少, 1.程序 ...

  7. 汇编和c语言混合编程缺点,汇编C语言混合编程经验总结

    ARM汇编语言和C语言混合编程 ATPCS规灾了一种模块化设计的观念,其基本内容是C模块(函数)和汇编模块(函数)相互的一套规?中还有类似的一套规晕腋芯谙呋惚喙δ芮看用有很多忌讳),厅知道(很寄几它/ ...

  8. 简述arm汇编和c语言混合编程,ARM汇编C语言混合编程

    3.4 ARM汇编&C语言混合编程 3.4.1 C内联ARM汇编 先看一个例子: # cat add.c 1 // add.c for s3c2410c board 2 // arm-linu ...

  9. arm汇编和c语言混合编程实验报告,arm实验ARM汇编和C语言混合编程.doc

    arm实验ARM汇编和C语言混合编程.doc 成绩辽宁工程技术大学上机实验报告课程名称汇编语言程序设计基于ARM体系结构实验题目ARM汇编和C语言混合编程院系软件学院专业软件工程班级姓名学号实验日期实 ...

最新文章

  1. 青少年编程竞赛交流群周报(第041周)
  2. react 拖拽连接插件_一款精美的 react 后台管理系统
  3. 微服务介绍及Asp.net Core实战项目系列之微服务介绍
  4. 星痕 轻松实现大屏数据可视化_数据美的历程有多难?大屏可视化轻松帮你实现...
  5. 2017年最喜欢的Visual Studio代码扩展
  6. Concepts in Games Development(游戏开发概述) 公开课笔记
  7. django 自定义权限_如何对django api做权限限制
  8. C# WinForm开发系列 - Regular Expression
  9. nodejs安装不好_nodejs安装过程中环境变量配置的问题
  10. Python 爬虫 —— 使用 pandas
  11. Educoder 机器学习 神经网络 第四关:使用pytorch搭建卷积神经网络识别手写数字
  12. PyCharm学习笔记04:PyCharm 键盘映射和快捷键 - Keymap Shortcuts
  13. 学习日记| javaScript在网页绘制国际象棋盘
  14. python读取.nii.gz文件并使用nibabel展示医学图片
  15. bitcoin简析一
  16. JAVA基础篇(一)
  17. python学习之天天向上代码
  18. pla3d打印材料密度_最新研究:PLA在3D打印中产生的有害气体最少
  19. java 拨打电话_快速拨打电话号码
  20. 大数据能否带来风控革命

热门文章

  1. Java中将字符类型转换成各种类型
  2. linux配置脚本启动快捷命令
  3. 新手站长如何从基础起步架构网站
  4. 创新工具|如何构建产品的最小可行架构(MVA)
  5. AE495 12组视频字幕动画手绘卡通MG图形动画教育文字标题效果工程ae模板
  6. 综合体无线网络覆盖的解决方案有什么?
  7. 放在github pages上的静态网站怎么取消绑定自定义域名?
  8. Jmeter_性能测试(一):性能测试的概念,性能测试的流程和术语,性能测试脚本的制作和调试
  9. 螺旋矩阵java_Java 实现螺旋矩阵的方法
  10. C#指定时区时间转为本地时间