socket属性控制

1高级套接字函数 getsockoptsetsockopt

int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen)
int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)

level
指定控制套接字的层次.可以取三种值
:
1)SOL_SOCKET:
通用套接字选项
.
2)IPPROTO_IP:IP
选项
.
3)IPPROTO_TCP:TCP
选项
.

对应的optname详细说明

optname
指定控制的方式(选项的名称
).

选项名称 说明 数据类型

======================================================================
SOL_SOCKET
SO_BROADCAST
允许发送广播数据
int
SO_DEBUG
允许调试
int
SO_DONTROUTE
不查找路由
int
SO_ERROR
获得套接字错误
int
SO_KEEPALIVE
保持连接
int
SO_LINGER
延迟关

SO_OOBINLINE 带外数据放入正常数据流 int
SO_RCVBUF
接收缓冲区大小
int
SO_SNDBUF
发送缓冲区大小
int
SO_RCVLOWAT
接收缓冲区下限
int
SO_SNDLOWAT
发送缓冲区下限
int
SO_RCVTIMEO
接收超时
struct timeval
SO_SNDTIMEO
发送超时
struct timeval
SO_REUSERADDR
允许重用本地地址和端口
int
SO_TYPE
获得套接字类型
int
SO_BSDCOMPAT
BSD系统兼容 int

IPPROTO_IP
IP_HDRINCL
在数据包中包含IP首部
int
IP_OPTINOS IP
首部选项
int
IP_TOS
服务类型

IP_TTL
生存时间 int

IPPRO_TCP
TCP_MAXSEG TCP
最大数据段的大小
int
TCP_NODELAY
不使用Nagle算法 int

optval获得或者是设置套接字选项.根据选项名称的数据类型进行转换 ,有时是套接字选项.ON或者OFF

2 高级套接字函数 ioctl

int ioctl(int fd,int req,...)
ioctl
可以控制所有的文件描述符的情况,这里介绍一下控制套接字的选项
.
ioctl
的控制选项

SIOCATMARK
是否到达带外标记
int
FIOASYNC
异步输入/输出标志
int
FIONREAD
缓冲区可读的字节数 int

详细的选项请用 man ioctl_list 查看.

3        高级套接字函数 fcntl

status = fcntl (hand, option, mode )

上述fcntl函数调用中,各参数定义如下:

    handle:已打开的文件句柄。

    option:一般可以是下列两种值:

        F_GETFL:表示读取文件状态值。

       F_SETFL:表示设置文件状态值。

(注意:F_GETFLF_SETFL都被定义在fcntl.h

    mode:如果optipnF_GETFL,则这个参数值可以是任意值。如果是F_SETFL,则参数值可以是下列值:

 O_WRONLY:将文件设置成只写状态。

O_RDWR   将文件设置成读写状态。

O_RDONLY:将文件设置成只读状态。

status:函数会将调用结果赋给status,如运行失败,则status的值会被设成-1

使用实例:

实例1:setsockopt

// 使得地址可被重用
int  optavl3 = 1
int  optlen3  =   sizeof ( int );
getsockopt(s, SOL_SOCKET, SO_REUSEADDR, 
& optavl3,  & optlen3);

 

实例2:fcntl

// 设置socket非阻塞
void  setnonblocking( int  sock)
{
    
int opts;
    opts 
= fcntl(sock, F_GETFL);
    
if (opts < 0)
    
{
        perror(
"fcntl(sock, GETFL)");
        exit(
1);
    }

    opts 
= opts|O_NONBLOCK;
    
if (fcntl(sock, F_SETFL, opts) < 0)
    
{
        perror(
"fcntl(sock, SETFL, opts)");
        exit(
1);
    }

}


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值