接收套接字大小限制好吗?

2 投票
3 回答
1421 浏览
提问于 2025-04-11 09:31

我正在用Python写一个程序,这个程序会充当服务器,接收来自客户端的数据。请问设置一个硬性的限制,规定可以接收的数据量,这样做是否合理?如果合理,为什么呢?

补充信息:有些聊天程序会限制每次发送的文字数量(也就是说,每次用户点击发送时),所以我的问题是,这样做是否有正当理由,如果有,是什么原因呢?

3 个回答

0

我不知道你具体的应用是什么,不过给客户端发送的数据设置一个硬性限制,可能会对减少你遭受拒绝服务攻击的风险有帮助。比如说,客户端连接后发送了100MB的数据,这可能会让你的应用负担过重,无法正常运行。

不过,这其实要看你的应用是什么。你是想限制每行数据的大小,还是每个连接的总数据量,或者其他什么呢?

1

你的问题到底是什么呢?

当你在一个套接字上使用接收功能时,实际上是立即返回当前套接字缓冲区中可用的数据。如果你给接收(或者读取,我想也是这个意思)一个很大的缓冲区,比如说40000字节,它可能一次性不会返回这么多数据。如果你给它一个很小的缓冲区,比如说100字节,它会立刻返回100字节的数据,但缓冲区里可能还有更多的数据。无论如何,你并没有限制客户端发送给你的数据量。

2

你可能见过一些代码,它们会防止接收到“多余”的数据。这通常是为了避免一种叫做缓冲区溢出的情况,简单来说,就是多余的数据被复制到内存中,超出了预先分配的数组范围,结果覆盖了可执行代码,可能让攻击者插入恶意代码。在像C这样的编程语言中,通常会有很多长度检查来防止这种攻击。像gets和strcpy这样的函数会被更安全的函数替代,比如fgets和strncpy,这些函数有长度参数,可以防止缓冲区溢出。

如果你使用的是像Python这样的动态语言,你的数组会自动调整大小,所以不会溢出并破坏其他内存,但你仍然需要小心处理外部数据。

聊天程序通常会限制消息的大小,这也是因为数据库字段的大小限制。如果你收到的消息中,80%的长度在40个字符以内,90%的在60个字符以内,98%的在80个字符以内,那为什么还要让你的消息文本字段支持每条消息10,000个字符呢?

撰写回答