Chinaunix首页 | 论坛 | 博客
  • 博客访问: 343233
  • 博文数量: 82
  • 博客积分: 3353
  • 博客等级: 中校
  • 技术积分: 742
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-20 19:13
文章分类

全部博文(82)

文章存档

2015年(1)

2014年(1)

2013年(1)

2012年(12)

2011年(3)

2010年(25)

2009年(37)

2008年(2)

我的朋友

分类: 系统运维

2009-07-07 11:26:45

ioctl可以控制所有的文件描述符的情况,这里介绍一下控制套接字的选项.   
int ioctl(int fd,int req,...)   
==========================================================================   
ioctl的控制选项   
--------------------------------------------------------------------------   
SIOCATMARK 是否到达带外标记 int   
FIOASYNC 异步输入/输出标志 int   
FIONREAD 缓冲区可读的字节数 int   
========================================================================== 

缓存/带外数据  
 
在字节流服务中,由于没有报文边界,用户进程在某一时刻可以读或写任意数量的字节。为保证传输正确或采用有流控制的协议时,都要进行缓存。但对某些特殊的需求,如交互式应用程序,又会要求取消这种缓存。  
 
在数据传送过程中,希望不通过常规传输方式传送给用户以便及时处理的某一类信息,如UNIX系统的中断键(Delete或Control-c)、终端流控制符(Control-s和Control-q),称为带外数据。逻辑上看,好象用户进程使用了一个独立的通道传输这些数据。该通道与每对连接的流相联系。由于Berkeley Software Distribution中对带外数据的实现与RFC 1122中规定的Host Agreement不一致,为了将互操作中的问题减到最小,应用程序编写者除非与现有服务互操作时要求带外数据外,最好不使用它。 

close 与shutdown的区别:
    close关闭的只是其本身,比如:d=dup(s)或者d=dup2(s),必须分别对s,d调用close,才能关闭总的套接字。而调用shutdown,只要调用一个,就能关闭所有与这个套接字的关联部分。
shutdown()关闭方式:
值    宏        描述
0    SHUT_RD        在指定的套接口上不再允许读操作。
1    SHUT_WR        在指定的套接口上不再允许写操作。
2    SHUT_RDWR    在指定的套接口上不再允许读写操作。
注意当how值指定为2时,这个函数的调用与close函数调用相同。


三种类型的地址:sockaddr,sockaddr_in和sockaddr_un。sockaddr是通用的套接字结构,sockaddr_in为Internet协议族的地址描述结构,sockaddr_un则是Unix协议组的地址描述结构。sockaddr_in结构中的sa_family决定是sockaddr_in还是sockaddr_un。

源码:
//test  struct  hostent * gethostbyname(const char *name)
    hostaddr = *gethostbyname("192.168.67.45");
    printf("gethostbyname 192.168.67.45 ,the h_name is:%s \n \
                     the h_aliases is:%s \n   \
                     the h_addrtype is:%d \n  \
                     the h_length is:%d \n  \
                         the h_addr_list[0] is:%u \n", \
                     hostaddr.h_name,\
                    *hostaddr.h_aliases, \
                    hostaddr.h_addrtype, \
                    hostaddr.h_length, \
                    *hostaddr.h_addr_list[0]);

执行结果:
gethostbyname 192.168.67.45 ,the h_name is:192.168.67.45            //主机名
                      the h_aliases is:(null)             //主机别名
                        the h_addrtype is:2            //地址类型
                       the h_length is:4               //地址长度
                           the h_addr_list[0] is:4294967232         //指向IPv4或IPv6的'地址'指针数组

gethostbyname 192.168.67.45 ,the h_name is:192.168.67.45    
the h_addrtype is:2                  
the h_length is:4                    
the h_addr_list[0] is:4294967232     


说明:
hostaddr.(*h_aliases), 是非法的,只能是*hostaddr.h_aliases,

struct hostent {
        char    *h_name;        /* official name of host */
        char    **h_aliases;    /* alias list */
        int     h_addrtype;     /* host address type */
        int     h_length;       /* length of address */
        char    **h_addr_list;  /* list of addresses */
}
#define h_addr  h_addr_list[0]  /* for backward compatibility */


阅读(1202) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~