time 
设为首页】【收藏本站
当前位置: 主页 > Unix/Linux > Linux管理 > Linux维护 > tcp.c文件的tcp_ioctl函数(16)

tcp.c文件的tcp_ioctl函数(16)

时间:2009-11-27 00:00 点击:926次 字体:[ ]





tcp.c文件的tcp_ioctl函数
978计划工作组 2009-8-25
1函数源码
int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg)
{
       int err;
       switch(cmd)
       {

              case TIOCINQ:
#ifdef FIXME /* FIXME: */
              case FIONREAD:
#endif            {
                     unsigned long amount;

                     if (sk->state == TCP_LISTEN)
                            return(-EINVAL);

                     sk->inuse = 1;
                     amount = tcp_readable(sk);
                     release_sock(sk);
                     err=verify_area(VERIFY_WRITE,(void *)arg,
                                             sizeof(unsigned long));
                     if(err)
                            return err;
                     put_fs_long(amount,(unsigned long *)arg);
                     return(0);
              }
              case SIOCATMARK:
              {
                     int answ = sk->urg_data && sk->urg_seq == sk->copied_seq;

                     err = verify_area(VERIFY_WRITE,(void *) arg,
                                            sizeof(unsigned long));
                     if (err)
                            return err;
                     put_fs_long(answ,(int *) arg);
                     return(0);
              }
              case TIOCOUTQ:
              {
                     unsigned long amount;

                     if (sk->state == TCP_LISTEN) return(-EINVAL);
                     amount = sk->prot->wspace(sk);
                     err=verify_area(VERIFY_WRITE,(void *)arg,
                                             sizeof(unsigned long));
                     if(err)
                            return err;
                     put_fs_long(amount,(unsigned long *)arg);
                     return(0);
              }
              default:
                     return(-EINVAL);
       }
}
2函数用途
查询相关信息。
3调用关系
4语句注释
4.1  case TIOCINQ:
       case FIONREAD:
       case SIOCATMARK:
       case TIOCOUTQ:
TIOCINQ/ FIONREAD:宏值为0x541B,用于查询下一个可读取数据包中数据长度。
SIOCATMARK:宏值为0x8905,用于判断下一个将要读取得数据是否为urgent 数据。。
TIOCOUTQ:宏值为0x5411,用于检测当前发送缓冲区中空闲空间大小。
4.2  err=verify_area(VERIFY_WRITE,(void *)arg, sizeof(unsigned long));
       put_fs_long(amount,(unsigned long *)arg);
VERIFY_WRITE:宏值为1,访问类型是写类型。
arg:用于返回函数的执行结果。
verify_area:验证参数地址空间是否存在,根据参数验证是否可读(VERIFY_READ)或可写(VERIFY_WRITE)。
put_fs_long:将第一个参数的值赋给第二个参数。
amount:可读取的数据字节数。
4.3 int answ = sk->urg_data && sk->urg_seq == sk->copied_seq;
answ:为1表示接收到了紧急数据且下一个要读取的就是紧急数据。
sk->urg_seq:值为紧急数据的序列号,而非紧急标志的序列号。




本文地址 : http://www.fengfly.com/plus/view-164002-1.html
标签: 文件 函数 arg err long unsigned
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: