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 */
阅读(1237) | 评论(0) | 转发(0) |