当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++基础入门教程

讨论 Setsockopt选项

    有时候我们要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要控制套接字的选项了.
    以下资料均从网上收集得到


    getsockopt 和 setsockopt
    获得套接口选项:
    [code:1:59df4ce128]
     int getsockopt ( int sockfd, int level, int optname, void * optval, socklen_t *opteln ) 设置套接口选项:
     int setsockopt ( int sockfd, int level, int optname, const void * optval, socklen_t *opteln )
     sockfd(套接字): 指向一个打开的套接口描述字
     level:(级别): 指定选项代码的类型。
    SOL_SOCKET: 基本套接口
    IPPROTO_IP: IPv4套接口
    IPPROTO_IPV6: IPv6套接口
    IPPROTO_TCP: TCP套接口
    optname(选项名): 选项名称
    optval(选项值): 是一个指向变量的指针 类型:整形,套接口结构, 其他结构类型:linger{}, timeval{ }
    optlen(选项长度) :optval 的大小

    返回值:标志打开或关闭某个特征的二进制选项
    [/code:1:59df4ce128]

    以下说明方法为
    选项名称 简要说明 数据类型
    补充


    ========================================================================
    SOL_SOCKET
    ------------------------------------------------------------------------
    SO_BROADCAST 允许发送广播数据 int
    适用於 UDP socket。其意义是允许 UDP socket 「广播」(broadcast)讯息到网路上。

    SO_DEBUG 允许调试 int

    SO_DONTROUTE 不查找路由 int

    SO_ERROR 获得套接字错误 int

    SO_KEEPALIVE 保持连接 int
    检测对方主机是否崩溃,避免(服务器)永远阻塞于TCP连接的输入。 设置该选项后,如果2小时内在此套接口的任一方向都没有数据交换,TCP就自动给对方 发一个保持存活探测分节(keepalive probe)。这是一个对方必须响应的TCP分节.它会导致以下三种情况: 对方接收一切正常:以期望的ACK响应。2小时后,TCP将发出另一个探测分节。 对方已崩溃且已重新启动:以RST响应。套接口的待处理错误被置为ECONNRESET,套接 口本身则被关闭。 对方无任何响应:源自berkeley的TCP发送另外8个探测分节,相隔75秒一个,试图得到 一个响应。在发出第一个探测分节11分钟15秒后若仍无响应就放弃。套接口的待处理错 误被置为ETIMEOUT,套接口本身则被关闭。如ICMP错误是“host unreachable(主机不 可达)”,说明对方主机并没有崩溃,但是不可达,这种情况下待处理错误被置为 EHOSTUNREACH。

 

    SO_DONTLINGER 若为真,则SO_LINGER选项被禁止。
    SO_LINGER 延迟关闭连接 struct linger
    上面这两个选项影响close行为
    选项 间隔 关闭方式 等待关闭与否
    SO_DONTLINGER 不关心 优雅 否
    SO_LINGER 零 强制 否
    SO_LINGER 非零 优雅 是
    若设置了SO_LINGER(亦即linger结构中的l_onoff域设为非零,参见2.4,4.1.7和4.1.21各节),并设置了零超时间隔,则closesocket()不被阻塞立即执行,不论是否有排队数据未发送或未被确认。这种关闭方式称为“强制”或“失效”关闭,因为套接口的虚电路立即被复位,且丢失了未发送的数据。在远端的recv()调用将以WSAECONNRESET出错。
    若设置了SO_LINGER并确定了非零的超时间隔,则closesocket()调用阻塞进程,直到所剩数据发送完毕或超时。这种关闭称为“优雅的”关闭。请注意如果套接口置为非阻塞且SO_LINGER设为非零超时,则closesocket()调用将以WSAEWOULDBLOCK错误返回。
    若在一个流类套接口上设置了SO_DONTLINGER(也就是说将linger结构的l_onoff域设为零;参见2.4,4.1.7,4.1.21节),则closesocket()调用立即返回。但是,如果可能,排队的数据将在套接口关闭前发送。请注意,在这种情况下WINDOWS套接口实现将在一段不确定的时间内保留套接口以及其他资源,这对于想用所以套接口的应用程序来说有一定影响。

 

    SO_OOBINLINE 带外数据放入正常数据流,在普通数据流中接收带外数据 int

  

共4页 首页 上一页 1 2 3 4 下一页 尾页 跳转到
相关内容
赞助商链接