我对C中的套接字库有几个问题.这是我在问题中引用的一段代码.
char recv_buffer[3000];
recv(socket, recv_buffer, 3000, 0);
Run Code Online (Sandbox Code Playgroud)
recv()收到的数据包大于我的缓冲区会怎么样? strcat用于连接recv()缓冲区的最新响应?我知道这里有很多问题,但我非常感谢任何回复.
我正在使用SocketServer模块作为TCP服务器.我在这里遇到了一些问题recv(),因为传入的数据包总是有不同的大小,所以如果我指定recv(1024)(我尝试使用更大的值,更小),它会在2或3个请求后被卡住,因为数据包长度将会更小(我认为),然后服务器卡住,直到超时.
class Test(SocketServer.BaseRequestHandler):
def handle(self):
print "From:", self.client_address
while True:
data = self.request.recv(1024)
if not data: break
if data[4] == "\x20":
self.request.sendall("hello")
if data[4] == "\x21":
self.request.sendall("bye")
else:
print "unknow packet"
self.request.close()
print "Disconnected", self.client_address
launch = SocketServer.ThreadingTCPServer(('', int(sys.argv[1])),Test)
launch.allow_reuse_address= True;
launch.serve_forever()
Run Code Online (Sandbox Code Playgroud)
如果客户端通过相同的源端口发送多个请求,但服务器卡住,任何帮助将非常感谢,谢谢!
假设我想使用标准socket模块从套接字读取一行:
def read_line(s):
ret = ''
while True:
c = s.recv(1)
if c == '\n' or c == '':
break
else:
ret += c
return ret
Run Code Online (Sandbox Code Playgroud)
究竟发生了s.recv(1)什么?它每次都会发出系统调用吗?我想我应该添加一些缓冲,无论如何:
为了最好地匹配硬件和网络现实,bufsize的值应该是2的相对较小的幂,例如4096.
http://docs.python.org/library/socket.html#socket.socket.recv
但是编写高效且线程安全的缓冲似乎并不容易.如果我使用file.readline()怎么办?
# does this work well, is it efficiently buffered?
s.makefile().readline()
Run Code Online (Sandbox Code Playgroud) 我的问题是关于Python的socket编程在Linux上,但由于Python的socket模块只是一个包装过的系统调用(recv,recvfrom等),这不是强烈的Python.
所以,根据文档,当我们称之为recv方法时,
为了最好地匹配硬件和网络现实,bufsize的值应该是2的相对较小的幂,例如,4096
这是什么意思?
最符合硬件和网络现实
我最关心的是性能.
它是否是我的网络软件的瓶颈,如果我通过我的自定义缓冲区(我后来在我的代码中使用它作为数据容器,它只是一个内存视图,如果它重要)与一些不是2的自定义大小的套接字.recv_into方法?
它只是一行代码,清晰而简短.
但是我的缓冲区的大小可以是17或51或者其他什么,所以我想知道,我应该实现一些具有"好"大小的内部环状缓冲区(如4096)并使用它来从块中读取数据块中的数据这样一个"好"的大小并写在那里,然后复制到我的缓冲区?
在性能方面有任何意义吗?
或者我当前的方案(当我从插槽中读取具有"坏"大小的块中的数据时,与"2的幂"规则不匹配)是好的吗?
换句话说:如果我们从1023大小而不是1024的块中读取套接字,它会影响性能吗?