[python 2.7] a question about exporting a new method to socket object

Hi python devs :
As a part of exploring an idea, I am trying to add a new method to the python socket object. Here's what I have been trying to do (the patch may be whitespace damaged so please bear with me) :
Index: Python-2.7/Modules/socketmodule.c =================================================================== --- Python-2.7.orig/Modules/socketmodule.c +++ Python-2.7/Modules/socketmodule.c @@ -126,6 +126,7 @@ makefile([mode, [bufsize]]) -- return a recv(buflen[, flags]) -- receive data\n\ recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\ recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\ +arecvfrom(buflen[, flags]) -- same as recvfrom \n\ recvfrom_into(buffer[, nbytes, [, flags])\n\ -- receive data and sender\'s address (into a buffer)\n\ sendall(data[, flags]) -- send all data\n\ @@ -468,6 +469,13 @@ static PyTypeObject sock_type; #define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE || s->sock_timeout <= 0.0) #endif
@@ -2620,6 +2802,58 @@ PyDoc_STRVAR(recvfrom_doc, \n\ Like recv(buffersize, flags) but also return the sender's address info.");
+static PyObject * +sock_arecvfrom(PySocketSockObject *s, PyObject *args) +{ + return sock_recvfrom(s,args); +} + +PyDoc_STRVAR(arecvfrom_doc, +"arecvfrom(buffersize[, flags]) -> (data, address info)\n\ +\n\ + experimental stuff");
/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
@@ -2963,6 +3197,8 @@ static PyMethodDef sock_methods[] = { recv_into_doc}, {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS, recvfrom_doc}, + {"arecvfrom", (PyCFunction)sock_arecvfrom, METH_VARARGS, + arecvfrom_doc}, {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS, recvfrom_into_doc}, {"send", (PyCFunction)sock_send, METH_VARARGS,
When I compile this and run a simple script like the following that uses arecvfrom() :
sock = socket.socket( socket.PF_PACKET, socket.SOCK_RAW ) sock.bind( ( intf, ETH_P_ALL ) )
(pkt,dontcare) = dst.arecvfrom( 500, socket.MSG_DONTWAIT )
I get this exception :
AttributeError: '_socketobject' object has no attribute 'arecvfrom'
So what am I doing wrong? How do I export this new socket method?
any help/pointer will be greatly appreciated.
cheers, ani

Hi Ani,
just a simple question: Are you sure, that you imported the modified socket module and not the original module from the distribution?
HTH,
Gerald
Am 21.06.2013 um 07:18 schrieb Ani Sinha ani@aristanetworks.com:
Hi python devs :
As a part of exploring an idea, I am trying to add a new method to the python socket object. Here's what I have been trying to do (the patch may be whitespace damaged so please bear with me) :
Index: Python-2.7/Modules/socketmodule.c
--- Python-2.7.orig/Modules/socketmodule.c +++ Python-2.7/Modules/socketmodule.c @@ -126,6 +126,7 @@ makefile([mode, [bufsize]]) -- return a recv(buflen[, flags]) -- receive data\n\ recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\ recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\ +arecvfrom(buflen[, flags]) -- same as recvfrom \n\ recvfrom_into(buffer[, nbytes, [, flags])\n\ -- receive data and sender\'s address (into a buffer)\n\ sendall(data[, flags]) -- send all data\n\ @@ -468,6 +469,13 @@ static PyTypeObject sock_type; #define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE || s->sock_timeout <= 0.0) #endif
@@ -2620,6 +2802,58 @@ PyDoc_STRVAR(recvfrom_doc, \n\ Like recv(buffersize, flags) but also return the sender's address info.");
+static PyObject * +sock_arecvfrom(PySocketSockObject *s, PyObject *args) +{
- return sock_recvfrom(s,args);
+}
+PyDoc_STRVAR(arecvfrom_doc, +"arecvfrom(buffersize[, flags]) -> (data, address info)\n\ +\n\
- experimental stuff");
/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
@@ -2963,6 +3197,8 @@ static PyMethodDef sock_methods[] = { recv_into_doc}, {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS, recvfrom_doc},
- {"arecvfrom", (PyCFunction)sock_arecvfrom, METH_VARARGS,
{"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS |arecvfrom_doc},
METH_KEYWORDS, recvfrom_into_doc}, {"send", (PyCFunction)sock_send, METH_VARARGS,
When I compile this and run a simple script like the following that uses arecvfrom() :
sock = socket.socket( socket.PF_PACKET, socket.SOCK_RAW ) sock.bind( ( intf, ETH_P_ALL ) )
(pkt,dontcare) = dst.arecvfrom( 500, socket.MSG_DONTWAIT )
I get this exception :
AttributeError: '_socketobject' object has no attribute 'arecvfrom'
So what am I doing wrong? How do I export this new socket method?
any help/pointer will be greatly appreciated.
cheers, ani
-- Ani _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/python.00%40klix.ch

Technically this list isn't the right place, but you probably are bitten by the duplication of functionality in Lib/socket.py. There's a list of methods at the top of that file, _socketmethods.
But you really shouldn't be asking here -- this list is for changes to Python, not using or hacking it. (Try StackOverflow for that.)
--Guido
On Thu, Jun 20, 2013 at 10:18 PM, Ani Sinha ani@aristanetworks.com wrote:
Hi python devs :
As a part of exploring an idea, I am trying to add a new method to the python socket object. Here's what I have been trying to do (the patch may be whitespace damaged so please bear with me) :
Index: Python-2.7/Modules/socketmodule.c
--- Python-2.7.orig/Modules/socketmodule.c +++ Python-2.7/Modules/socketmodule.c @@ -126,6 +126,7 @@ makefile([mode, [bufsize]]) -- return a recv(buflen[, flags]) -- receive data\n\ recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\ recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\ +arecvfrom(buflen[, flags]) -- same as recvfrom \n\ recvfrom_into(buffer[, nbytes, [, flags])\n\ -- receive data and sender\'s address (into a buffer)\n\ sendall(data[, flags]) -- send all data\n\ @@ -468,6 +469,13 @@ static PyTypeObject sock_type; #define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE || s->sock_timeout <= 0.0) #endif
@@ -2620,6 +2802,58 @@ PyDoc_STRVAR(recvfrom_doc, \n\ Like recv(buffersize, flags) but also return the sender's address info.");
+static PyObject * +sock_arecvfrom(PySocketSockObject *s, PyObject *args) +{
- return sock_recvfrom(s,args);
+}
+PyDoc_STRVAR(arecvfrom_doc, +"arecvfrom(buffersize[, flags]) -> (data, address info)\n\ +\n\
- experimental stuff");
/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
@@ -2963,6 +3197,8 @@ static PyMethodDef sock_methods[] = { recv_into_doc}, {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS, recvfrom_doc},
- {"arecvfrom", (PyCFunction)sock_arecvfrom, METH_VARARGS,
{"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS |arecvfrom_doc},
METH_KEYWORDS, recvfrom_into_doc}, {"send", (PyCFunction)sock_send, METH_VARARGS,
When I compile this and run a simple script like the following that uses arecvfrom() :
sock = socket.socket( socket.PF_PACKET, socket.SOCK_RAW ) sock.bind( ( intf, ETH_P_ALL ) )
(pkt,dontcare) = dst.arecvfrom( 500, socket.MSG_DONTWAIT )
I get this exception :
AttributeError: '_socketobject' object has no attribute 'arecvfrom'
So what am I doing wrong? How do I export this new socket method?
any help/pointer will be greatly appreciated.
cheers, ani
-- Ani
Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/guido%40python.org

Hi Guido :
Thanks a lot. That helped.
I will try StackOverflow next time.
cheers, ani
On Fri, Jun 21, 2013 at 8:07 AM, Guido van Rossum guido@python.org wrote:
Technically this list isn't the right place, but you probably are bitten by the duplication of functionality in Lib/socket.py. There's a list of methods at the top of that file, _socketmethods.
But you really shouldn't be asking here -- this list is for changes to Python, not using or hacking it. (Try StackOverflow for that.)
--Guido
On Thu, Jun 20, 2013 at 10:18 PM, Ani Sinha ani@aristanetworks.com wrote:
Hi python devs :
As a part of exploring an idea, I am trying to add a new method to the python socket object. Here's what I have been trying to do (the patch
may be
whitespace damaged so please bear with me) :
Index: Python-2.7/Modules/socketmodule.c
--- Python-2.7.orig/Modules/socketmodule.c +++ Python-2.7/Modules/socketmodule.c @@ -126,6 +126,7 @@ makefile([mode, [bufsize]]) -- return a recv(buflen[, flags]) -- receive data\n\ recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\ recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\ +arecvfrom(buflen[, flags]) -- same as recvfrom \n\ recvfrom_into(buffer[, nbytes, [, flags])\n\ -- receive data and sender\'s address (into a buffer)\n\ sendall(data[, flags]) -- send all data\n\ @@ -468,6 +469,13 @@ static PyTypeObject sock_type; #define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE || s->sock_timeout
<=
0.0) #endif
@@ -2620,6 +2802,58 @@ PyDoc_STRVAR(recvfrom_doc, \n\ Like recv(buffersize, flags) but also return the sender's address
info.");
+static PyObject * +sock_arecvfrom(PySocketSockObject *s, PyObject *args) +{
- return sock_recvfrom(s,args);
+}
+PyDoc_STRVAR(arecvfrom_doc, +"arecvfrom(buffersize[, flags]) -> (data, address info)\n\ +\n\
- experimental stuff");
/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
@@ -2963,6 +3197,8 @@ static PyMethodDef sock_methods[] = { recv_into_doc}, {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS, recvfrom_doc},
- {"arecvfrom", (PyCFunction)sock_arecvfrom, METH_VARARGS,
{"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS |arecvfrom_doc},
METH_KEYWORDS, recvfrom_into_doc}, {"send", (PyCFunction)sock_send, METH_VARARGS,
When I compile this and run a simple script like the following that uses arecvfrom() :
sock = socket.socket( socket.PF_PACKET, socket.SOCK_RAW ) sock.bind( ( intf, ETH_P_ALL ) )
(pkt,dontcare) = dst.arecvfrom( 500, socket.MSG_DONTWAIT )
I get this exception :
AttributeError: '_socketobject' object has no attribute 'arecvfrom'
So what am I doing wrong? How do I export this new socket method?
any help/pointer will be greatly appreciated.
cheers, ani
-- Ani
Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/guido%40python.org
-- --Guido van Rossum (python.org/~guido)
participants (3)
-
Ani Sinha
-
Gerald Klix
-
Guido van Rossum