⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 miniupnpcmodule.c

📁 很小的linux下的upnp客户端代码
💻 C
字号:
/* $Id: miniupnpcmodule.c,v 1.6 2007/10/16 15:07:33 nanard Exp $*//* Project : miniupnp * Author : Thomas BERNARD * website : http://miniupnp.tuxfamily.org/ * copyright (c) 2007 Thomas Bernard * This software is subjet to the conditions detailed in the * provided LICENCE file. */#include <Python.h>#define STATICLIB#include "structmember.h"#include "miniupnpc.h"#include "upnpcommands.h"/* for compatibility with Python < 2.4 */#ifndef Py_RETURN_NONE#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None#endif#ifndef Py_RETURN_TRUE#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True#endif#ifndef Py_RETURN_FALSE#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False#endiftypedef struct {    PyObject_HEAD    /* Type-specific fields go here. */	struct UPNPDev * devlist;	struct UPNPUrls urls;	struct IGDdatas data;	char lanaddr[16];	/* our ip address on the LAN */} UPnPObject;static PyMemberDef UPnP_members[] = {	{"lanaddr", T_STRING_INPLACE, offsetof(UPnPObject, lanaddr),	 READONLY, "ip address on the LAN"	},	{NULL}};static voidUPnPObject_dealloc(UPnPObject *self){	freeUPNPDevlist(self->devlist);	FreeUPNPUrls(&self->urls);	self->ob_type->tp_free((PyObject*)self);}static PyObject *UPnP_discover(UPnPObject *self){	struct UPNPDev * dev;	int i;	PyObject *res = NULL;	if(self->devlist)	{		freeUPNPDevlist(self->devlist);		self->devlist = 0;	}	self->devlist = upnpDiscover(2000, 0/* multicast if*/);	/* Py_RETURN_NONE ??? */	for(dev = self->devlist, i = 0; dev; dev = dev->pNext)		i++;	res = Py_BuildValue("i", i);	return res;}static PyObject *UPnP_selectigd(UPnPObject *self){	if(UPNP_GetValidIGD(self->devlist, &self->urls, &self->data,	                    self->lanaddr, sizeof(self->lanaddr)))	{		return Py_BuildValue("s", self->urls.controlURL);	}	else	{		/* TODO: exception ! */		return NULL;	}}static PyObject *UPnP_totalbytesent(UPnPObject *self){	return Py_BuildValue("I",	           UPNP_GetTotalBytesSent(self->urls.controlURL_CIF,			                          self->data.servicetype_CIF));}static PyObject *UPnP_totalbytereceived(UPnPObject *self){	return Py_BuildValue("I",	           UPNP_GetTotalBytesReceived(self->urls.controlURL_CIF,			                          self->data.servicetype_CIF));}static PyObject *UPnP_totalpacketsent(UPnPObject *self){	return Py_BuildValue("I",	           UPNP_GetTotalPacketsSent(self->urls.controlURL_CIF,			                          self->data.servicetype_CIF));}static PyObject *UPnP_totalpacketreceived(UPnPObject *self){	return Py_BuildValue("I",	           UPNP_GetTotalPacketsReceived(self->urls.controlURL_CIF,			                          self->data.servicetype_CIF));}static PyObject *UPnP_statusinfo(UPnPObject *self){	char status[64];	unsigned int uptime;	UPNP_GetStatusInfo(self->urls.controlURL, self->data.servicetype,	                   status, &uptime);	return Py_BuildValue("(s,I)", status, uptime);}static PyObject *UPnP_connectiontype(UPnPObject *self){	char connectionType[64];	UPNP_GetConnectionTypeInfo(self->urls.controlURL,	                           self->data.servicetype,							   connectionType);	return Py_BuildValue("s", connectionType);}static PyObject *UPnP_externalipaddress(UPnPObject *self){	char externalIPAddress[16];	UPNP_GetExternalIPAddress(self->urls.controlURL,	                          self->data.servicetype,							  externalIPAddress);	return Py_BuildValue("s", externalIPAddress);}/* AddPortMapping(externalPort, protocol, internalHost, internalPort, desc)  * protocol is 'UDP' or 'TCP' */static PyObject *UPnP_addportmapping(UPnPObject *self, PyObject *args){	char extPort[6];	unsigned short ePort;	char inPort[6];	unsigned short iPort;	const char * proto;	const char * host;	const char * desc;	int r;	if (!PyArg_ParseTuple(args, "HssHs", &ePort, &proto,	                                     &host, &iPort, &desc))        return NULL;	sprintf(extPort, "%hu", ePort);	sprintf(inPort, "%hu", iPort);	r = UPNP_AddPortMapping(self->urls.controlURL, self->data.servicetype,	                        extPort, inPort, host, desc, proto);	if(r)	{		Py_RETURN_TRUE;	}	else	{		Py_RETURN_FALSE;	}}/* DeletePortMapping(extPort, proto) * proto = 'UDP', 'TCP' */static PyObject *UPnP_deleteportmapping(UPnPObject *self, PyObject *args){	char extPort[6];	unsigned short ePort;	const char * proto;	if(!PyArg_ParseTuple(args, "Hs", &ePort, &proto))		return NULL;	sprintf(extPort, "%hu", ePort);	UPNP_DeletePortMapping(self->urls.controlURL, self->data.servicetype,	                       extPort, proto);	Py_RETURN_TRUE;}static PyObject *UPnP_getportmappingnumberofentries(UPnPObject *self){	unsigned int n = 0;	UPNP_GetPortMappingNumberOfEntries(self->urls.controlURL,	                                   self->data.servicetype,									   &n);	return Py_BuildValue("I", n);}/* GetSpecificPortMapping(ePort, proto)  * proto = 'UDP' or 'TCP' */static PyObject *UPnP_getspecificportmapping(UPnPObject *self, PyObject *args){	char extPort[6];	unsigned short ePort;	const char * proto;	char intClient[16];	char intPort[6];	unsigned short iPort;	if(!PyArg_ParseTuple(args, "Hs", &ePort, &proto))		return NULL;	sprintf(extPort, "%hu", ePort);	UPNP_GetSpecificPortMappingEntry(self->urls.controlURL,	                                 self->data.servicetype,									 extPort, proto,									 intClient, intPort);	if(intClient[0])	{		iPort = (unsigned short)atoi(intPort);		return Py_BuildValue("(s,H)", intClient, iPort);	}	else	{		Py_RETURN_NONE;	}}/* GetGenericPortMapping(index) */static PyObject *UPnP_getgenericportmapping(UPnPObject *self, PyObject *args){	int i, r;	char index[8];	char intClient[16];	char intPort[6];	unsigned short iPort;	char extPort[6];	unsigned short ePort;	char protocol[4];	char desc[80];	char enabled[6];	char rHost[64];	char duration[16];	/* lease duration */	unsigned int dur;	if(!PyArg_ParseTuple(args, "i", &i))		return NULL;	snprintf(index, sizeof(index), "%d", i);	rHost[0] = '\0'; enabled[0] = '\0';	duration[0] = '\0'; desc[0] = '\0';	extPort[0] = '\0'; intPort[0] = '\0'; intClient[0] = '\0';	r = UPNP_GetGenericPortMappingEntry(self->urls.controlURL,	                                    self->data.servicetype,										index,										extPort, intClient, intPort,										protocol, desc, enabled, rHost,										duration);	if(r)	{		Py_RETURN_NONE;	}	else	{		ePort = (unsigned short)atoi(extPort);		iPort = (unsigned short)atoi(intPort);		dur = (unsigned int)strtoul(duration, 0, 0);		return Py_BuildValue("(H,s,(s,H),s,s,s,I)",		                     ePort, protocol, intClient, iPort,		                     desc, enabled, rHost, dur);	}}/* miniupnpc.UPnP object Method Table */static PyMethodDef UPnP_methods[] = {    {"discover", (PyCFunction)UPnP_discover, METH_NOARGS,     "discover UPnP IGD devices on the network"    },	{"selectigd", (PyCFunction)UPnP_selectigd, METH_NOARGS,	 "select a valid UPnP IGD among discovered devices"	},	{"totalbytesent", (PyCFunction)UPnP_totalbytesent, METH_NOARGS,	 "return the total number of bytes sent by UPnP IGD"	},	{"totalbytereceived", (PyCFunction)UPnP_totalbytereceived, METH_NOARGS,	 "return the total number of bytes received by UPnP IGD"	},	{"totalpacketsent", (PyCFunction)UPnP_totalpacketsent, METH_NOARGS,	 "return the total number of packets sent by UPnP IGD"	},	{"totalpacketreceived", (PyCFunction)UPnP_totalpacketreceived, METH_NOARGS,	 "return the total number of packets received by UPnP IGD"	},	{"statusinfo", (PyCFunction)UPnP_statusinfo, METH_NOARGS,	 "return status and uptime"	},	{"connectiontype", (PyCFunction)UPnP_connectiontype, METH_NOARGS,	 "return IGD WAN connection type"	},	{"externalipaddress", (PyCFunction)UPnP_externalipaddress, METH_NOARGS,	 "return external IP address"	},	{"addportmapping", (PyCFunction)UPnP_addportmapping, METH_VARARGS,	 "add a port mapping"	},	{"deleteportmapping", (PyCFunction)UPnP_deleteportmapping, METH_VARARGS,	 "delete a port mapping"	},	{"getportmappingnumberofentries", (PyCFunction)UPnP_getportmappingnumberofentries, METH_NOARGS,	 "-- non standard --"	},	{"getspecificportmapping", (PyCFunction)UPnP_getspecificportmapping, METH_VARARGS,	 "get details about a specific port mapping entry"	},	{"getgenericportmapping", (PyCFunction)UPnP_getgenericportmapping, METH_VARARGS,	 "get all details about the port mapping at index"	},    {NULL}  /* Sentinel */};static PyTypeObject UPnPType = {    PyObject_HEAD_INIT(NULL)    0,                         /*ob_size*/    "miniupnpc.UPnP",          /*tp_name*/    sizeof(UPnPObject),        /*tp_basicsize*/    0,                         /*tp_itemsize*/    (destructor)UPnPObject_dealloc,/*tp_dealloc*/    0,                         /*tp_print*/    0,                         /*tp_getattr*/    0,                         /*tp_setattr*/    0,                         /*tp_compare*/    0,                         /*tp_repr*/    0,                         /*tp_as_number*/    0,                         /*tp_as_sequence*/    0,                         /*tp_as_mapping*/    0,                         /*tp_hash */    0,                         /*tp_call*/    0,                         /*tp_str*/    0,                         /*tp_getattro*/    0,                         /*tp_setattro*/    0,                         /*tp_as_buffer*/    Py_TPFLAGS_DEFAULT,        /*tp_flags*/    "UPnP objects",            /* tp_doc */    0,		                   /* tp_traverse */    0,		                   /* tp_clear */    0,		                   /* tp_richcompare */    0,		                   /* tp_weaklistoffset */    0,		                   /* tp_iter */    0,		                   /* tp_iternext */    UPnP_methods,              /* tp_methods */    UPnP_members,              /* tp_members */    0,                         /* tp_getset */    0,                         /* tp_base */    0,                         /* tp_dict */    0,                         /* tp_descr_get */    0,                         /* tp_descr_set */    0,                         /* tp_dictoffset */    0,/*(initproc)UPnP_init,*/      /* tp_init */    0,                         /* tp_alloc */#ifndef WIN32    PyType_GenericNew,/*UPnP_new,*/      /* tp_new */#else    0,#endif};/* module methods */static PyMethodDef miniupnpc_methods[] = {    {NULL}  /* Sentinel */};#ifndef PyMODINIT_FUNC	/* declarations for DLL import/export */#define PyMODINIT_FUNC void#endifPyMODINIT_FUNCinitminiupnpc(void) {    PyObject* m;#ifdef WIN32    UPnPType.tp_new = PyType_GenericNew;#endif    if (PyType_Ready(&UPnPType) < 0)        return;    m = Py_InitModule3("miniupnpc", miniupnpc_methods,                       "miniupnpc module.");    Py_INCREF(&UPnPType);    PyModule_AddObject(m, "UPnP", (PyObject *)&UPnPType);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -