相关疑难解决方法(0)

在套接字库中调用recv时,我的recv缓冲区应该有多大

我对C中的套接字库有几个问题.这是我在问题中引用的一段代码.

char recv_buffer[3000];
recv(socket, recv_buffer, 3000, 0);
Run Code Online (Sandbox Code Playgroud)
  1. 如何确定recv_buffer的大小?我使用3000,但这是任意的.
  2. 如果recv()收到的数据包大于我的缓冲区会怎么样?
  3. 我怎么知道我是否收到了整个消息而没有再次调用recv并且在没有任何东西被接收时让它永远等待?
  4. 有没有办法让缓冲区没有固定的空间,这样我可以继续添加它而不用担心空间不足?也许strcat用于连接recv()缓冲区的最新响应?

我知道这里有很多问题,但我非常感谢任何回复.

c sockets buffer recv

126
推荐指数
4
解决办法
10万
查看次数

Python套接字接收 - 传入的数据包总是有不同的大小

我正在使用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)

如果客户端通过相同的源端口发送多个请求,但服务器卡住,任何帮助将非常感谢,谢谢!

python networking timeout recv

37
推荐指数
3
解决办法
11万
查看次数

Python套接字缓冲

假设我想使用标准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 sockets buffering

21
推荐指数
3
解决办法
6万
查看次数

套接字recv缓冲区大小

我的问题是关于Python的socket编程在Linux上,但由于Python的socket模块只是一个包装过的系统调用(recv,recvfrom等),这不是强烈的Python.

所以,根据文档,当我们称之为recv方法时,

为了最好地匹配硬件和网络现实,bufsize的值应该是2的相对较小的幂,例如,4096

这是什么意思?

最符合硬件和网络现实

我最关心的是性能.

它是否是我的网络软件的瓶颈,如果我通过我的自定义缓冲区(我后来在我的代码中使用它作为数据容器,它只是一个内存视图,如果它重要)与一些不是2的自定义大小的套接字.recv_into方法?

它只是一行代码,清晰而简短.

但是我的缓冲区的大小可以是17或51或者其他什么,所以我想知道,我应该实现一些具有"好"大小的内部环状缓冲区(如4096)并使用它来从块中读取数据块中的数据这样一个"好"的大小并写在那里,然后复制到我的缓冲区?

在性能方面有任何意义吗?

或者我当前的方案(当我从插槽中读取具有"坏"大小的块中的数据时,与"2的幂"规则不匹配)是好的吗?

换句话说:如果我们从1023大小而不是1024的块中读取套接字,它会影响性能吗?

python sockets linux buffer

2
推荐指数
1
解决办法
2万
查看次数

标签 统计

python ×3

sockets ×3

buffer ×2

recv ×2

buffering ×1

c ×1

linux ×1

networking ×1

timeout ×1