• linux网络编程中的超时设置


    1 下面是在网上找到的资料,先非常的感谢。

    用setsockopt()来控制recv()与send()的超时

    在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制: 
    Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数,
    int nNetTimeout=1000;//1秒, 
    //设置发送超时 
    setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int)); 
    //设置接收超时 
    setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int)); 
    这样做在linux环境下是不会产生效果的,须如下定义:struct timeval timeout = {3,0}; 
    //设置发送超时 
    setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval)); 
    //设置接收超时 
    setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval)); 
    有两点注意就是: 
    1)recv ()的第四个参数需为MSG_WAITALL,在阻塞模式下不等到指定数目的数据不会返回,除非超时时间到。还要注意的是只要设置了接收超时,在没有 MSG_WAITALL时也是有效的。说到底超时就是不让你的程序老在那儿等,到一定时间进行一次返回而已。 
    2)即使等待超时时间值未到,但对方已经关闭了socket, 则此时recv()会立即返回,并收到多少数据返回多少数据。

    2 项目问题描述

    客户端需要每分钟去服务器拉去日志,文件大小不定,为了服务端数据库的备份,当服务端数据库崩溃以后需要修换路径,所以服务端需要重启,那么问题来了,如果正是客户端发送线程的时候服务端断了,怎么办?

    现象----->客户端不在继续发送线程,只是下载线程。猜想可能是因为没有收到服务端的确认信息,经过调试发现不是。后来定位到recv这个函数上面。尝试设置超时3秒,出现了新的问题,就是这个文件的发送成无限发送,最终知道勒问题的原因就是:设置的时间太短,以至于文件太大没有发送完,备份数据库就没有清除这个文件编号,导致循环发送。设置为一分钟就好了。

    加油骚年。。。。。。。

  • 相关阅读:
    《淘宝网》之系统质量属性分析
    《架构漫谈》读后感 之“关于软件架构师如何工作”
    《软件需求》读后感06
    《软件需求》读后感05
    Cforeach的详细用法--【转】
    事件(Event)(onclick,onchange,onload,onunload,onfocus,onblur,onselect,onmuse)【转载】
    十七、Mysql的主从(一)--主从原理
    十七、Mysql的主从(二)--主从复制部署
    十六、mysql的备份与恢复(三)--xtrabackup(XBK、Xbackup)
    十六、mysql的备份与恢复(二)--mysqldump
  • 原文地址:https://www.cnblogs.com/lanjianhappy/p/8930827.html
Copyright © 2020-2023  润新知