python和C语言混合编程实例

您所在的位置:网站首页 python和c语言混合编程 python和C语言混合编程实例

python和C语言混合编程实例

2023-04-05 08:30| 来源: 网络整理| 查看: 265

python和C语言混合编程实例 思创斯忠实用户-ss • 2023年4月1日 13:00 • Python

python和C语言混合编程实例转载自:http://www.jb51.net/article/50633.htm这篇文章主要介绍了python和C语言混合编程实例,文中开发了一个tcp端口ping程序来介绍混合编程,需要的朋友可以参考下。最近为了测试网速情况怎么样,由于部分业务服务器需要关闭icmp,这样的话采用普通的ping就无法适应我的需求,于是自己简单的写了一个基于tcp端口的ping的程序,由于c执

大家好,我是你的好朋友思创斯。今天说一说python和C语言混合编程实例,希望您对编程的造诣更进一步.

转载自: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 #include #include #include #include #include #include /* 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 python import 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几乎没有什么差别。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由思创斯整理,转载请注明出处:https://ispacesoft.com/120110.html

赞 (0) 思创斯忠实用户-ss思创斯忠实用户-ss 0 0 生成海报


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3