socket堵塞的解决方法

进行网络开发会出现堵塞的情况,一般来说,会有三种解决办法:

  1. 在头部约定好数据的长度。当读取到的长度等于这个长度时就不再继续调用recv方法
  2. 约定结束标志,当读到该结束标志时退出不再recv
  3. 设置超时,会在设置的超时时间到达后退出而不再阻塞

第一种方法简单实用,但是如果返回头信息中是transfer-encoding:chunked,即分块传输的情况无法使用;
第二种方法碰到比较复杂的返回不好处理;
第三种可以,但是对网络的要求比较高。

对于分块传输的情况则不能通过Content-Length:xx来获取报文长度,我是通过设置超时来解决的,代码如下:

while(1)
    {
        FD_ZERO(&rfds);//清空描述符集合 
        FD_SET(0, &rfds);//将标准输入(stdin)添加到集合中
        FD_SET(socket_fd, &rfds);//将我们的套接字描述符添加到集合中
        /*设置超时时间*/
        timeout.tv_sec = 1;   
      
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
打开 socket 连接会耗尽资源的原因有很多,以下是一些常见的原因和解决方法: 1. 资源泄漏:在使用完 socket 连接后没有正确地关闭连接,导致连接资源无法释放。确保在使用完连接后调用 `close()` 或 `shutdown()` 方法来关闭连接。 2. 连接泄漏:在使用完连接后没有及时释放连接对象,导致连接资源无法回收。确保在使用完连接后及时将连接对象置为 null,使其可以被垃圾回收。 3. 连接数限制:操作系统或网络设备可能对同时打开的连接数有限制。可以通过调整操作系统的连接数限制或者合理地管理连接的生命周期来避免资源耗尽。 4. 高并发请求:如果同时有大量的请求需要建立 socket 连接,可能会导致资源耗尽。可以考虑使用连接池来管理连接,以便重复使用已经建立的连接,避免频繁地创建和关闭连接。 5. 慢速或堵塞的连接:如果连接的对端响应缓慢或者存在网络拥塞等问题,可能会导致连接资源被占用较长时间,进而耗尽可用的连接资源。可以考虑设置适当的超时时间,以便及时释放资源并重试。 6. 错误的连接使用方式:如果连接的使用方式不正确,比如频繁地创建和关闭连接,或者不合理地使用连接资源,都可能导致资源耗尽。需要合理地设计和使用连接,避免不必要的资源消耗。 在实际开发中,需要仔细分析具体的场景和问题,结合具体的技术栈和环境来解决资源耗尽的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值