子类化套接字 [英] Subclassing socket

查看:77
本文介绍了子类化套接字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

套接字对象有点怪癖。如果你试图在

阻塞套接字上收到0个字节,它们会阻塞。也就是说,如果我调用recv(0),它会阻止

(直到某些数据到达)。


我认为这是错的,但我不想争辩。我想

创建一个修复问题的套接字子类。理想情况下,

之类的东西:


类new_socket(套接字):

def recv(self,bufsize,flags = 0) :

if bufsize == 0:

return""

else:

return socket.recv (bufsize,flags)


他们唯一的问题是,套接字通过接受

调用返回套接字对象。返回的套接字是socket类型,当然不是我想要的b $ b new_socket。我可以覆盖accept()返回一个

new_socket,但我不知道如何将旧套接字转换为新的

套接字。也就是说,我想在上面的课程中添加一个方法

喜欢:


def接受(个体经营):

conn,addr = socket.accept()

<转换conn,这是类型socket以输入new_socket>

return(conn,addr)


有没有人对如何做到这一点有任何建议?

解决方案

imho:

类new_socket(套接字):

def __init __(self,family = AF_INET,type = SOCK_STREAM,proto = 0,

_sock = None)

socket .__ init __(self,family = AF_INET,type = SOCK_STREAM,proto = 0,

_sock = None)


def接受(个体经营):

conn,addr = socket.accept()

return(new_socket(_sock = conn),addr)


但是我认为你的问题有一个更简单的方式然后继承




你必须聚合套接字和对象必须有fileno方法,

那样可以使用select.select来使用你班级的实例。功能

class mySocket:


def __init __(self,...):

self .__ socket = None

...

def fileno(个体经营):

返回自我.__ socket.fileno()

def connect(self ,__ host,__ port):

试试:

self.close()

self .__ socket = socket.socket(socket.AF_INET,socket .SOCK_STREAM)

self .__ socket.connect((__ host,__ port))

...

def close(self):

试试:

如果self .__ socket不是None:

self .__ socket.close()

finally:

self .__ socket =无


...
gr ***************** @ spamgourmet.com 写道:

套接字对象有点怪癖。如果您尝试在
阻塞套接字上接收0字节,则会阻止。也就是说,如果我调用recv(0),它会阻止
(直到某些数据到达)。

我认为这是错的,但我不想争辩。我想创建一个修复问题的套接字子类。理想情况下,类似于:

类new_socket(套接字):
def recv(self,bufsize,flags = 0):
如果bufsize == 0:
return"
else:
返回socket.recv(bufsize,flags)

他们唯一的问题是,套接字通过accept
打电话。返回的socket是socket类型,当然不是new_socket,正如我想的那样。我可以覆盖accept()来返回一个
new_socket,但我不知道如何将旧套接字转换为新的套接字。也就是说,我想在上面的类中添加一个方法,例如:

def accept(self):
conn,addr = socket.accept()
<转换conn,这是类型socket以输入new_socket>
返回(conn,addr)

有没有人对如何进行上述操作有任何建议?


-

祝你好运,

Maksim Kasimov

mailto: ma ************ @ gmail.com

更简单的方法?那是什么?


socket objects have a little quirk. If you try to receive 0 bytes on a
blocking socket, they block. That is, if I call recv(0), it blocks
(until some data arrives).

I think that''s wrong, but I don''t want to argue that. I would like to
create a subclass of socket that fixes the problem. Ideally, something
like:

class new_socket(socket):
def recv( self, bufsize, flags=0 ):
if bufsize == 0:
return ""
else:
return socket.recv( bufsize, flags )

They only problem is, sockets return socket objects via the accept
call. And the socket returned is of type socket, of course, not
new_socket, as I would like. I could override accept() to return a
new_socket, but I don''t know how to convert the old socket to a new
socket. That is, I''d like to add a method to the class above something
like:

def accept( self ):
conn, addr = socket.accept()
<convert conn, which is type socket to type new_socket>
return ( conn, addr )

Does anyone have any suggestions on how to do the above?

解决方案

imho:
class new_socket(socket):
def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0,
_sock=None)
socket.__init__(self, family=AF_INET, type=SOCK_STREAM, proto=0,
_sock=None)

def accept( self ):
conn, addr = socket.accept()
return ( new_socket(_sock=conn), addr )

but i think your problem have a more simple way then inheritance



you have to agregate socket and the object must have "fileno" method,
thats gives a possibility to use instanses of your class with "select.select" function
class mySocket:

def __init__(self, ...):
self.__socket = None
...
def fileno(self):
return self.__socket.fileno()
def connect(self, __host, __port):
try:
self.close()
self.__socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.__socket.connect((__host, __port))
...
def close(self):
try:
if self.__socket is not None:
self.__socket.close()
finally:
self.__socket = None

...
gr*****************@spamgourmet.com wrote:

socket objects have a little quirk. If you try to receive 0 bytes on a
blocking socket, they block. That is, if I call recv(0), it blocks
(until some data arrives).

I think that''s wrong, but I don''t want to argue that. I would like to
create a subclass of socket that fixes the problem. Ideally, something
like:

class new_socket(socket):
def recv( self, bufsize, flags=0 ):
if bufsize == 0:
return ""
else:
return socket.recv( bufsize, flags )

They only problem is, sockets return socket objects via the accept
call. And the socket returned is of type socket, of course, not
new_socket, as I would like. I could override accept() to return a
new_socket, but I don''t know how to convert the old socket to a new
socket. That is, I''d like to add a method to the class above something
like:

def accept( self ):
conn, addr = socket.accept()
<convert conn, which is type socket to type new_socket>
return ( conn, addr )

Does anyone have any suggestions on how to do the above?


--
Best regards,
Maksim Kasimov
mailto: ma************@gmail.com


More simple way? What''s that?


这篇关于子类化套接字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆