高级socket函数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
15
15/40 Luobing Dong
高级socket函数
n recv和send
l
控制参数说明表
标志
recv
send
MSG_DONTROUT E
MSG_OOB MSG_PEEK √ √


MSG_WAITALL

16
16/40 Luobing Dong
高级socket函数
n int shutdown(int sockfd,int howto);
6
6/40 Luobing Dong
域名访问
n 域名到IP的转换函数
l
gethostbyname示例
7
7/40 Luobing Dong
struct hostent *he=gethostbyname(―www.sina.com.cn‖); if(he!=NULL){ printf("h_name:%s\n",he->h_name); printf("h_length:%d\n",he->h_length); printf("h_addrtype:%d",he->h_addrtype; for(i=0;he->h_aliases[i] !=NULL;i++) printf("h_aliases%d:%s\n",i+1,he->h_aliases[i]); //列出所有地址 for(i=0;he->h_addr_list[i]!=NULL;i++){ struct in_addr *addr; addr=(struct in_addr *)he->h_addr_list[i]; printf("ip%d:%s\n",(i+1),inet_ntoa(*addr)); } } else printf("gethostbyname error:%s\n",hstrerror(h_errno));
这个socket
shutdown和close的区别
– shutdown操作连接通道,其他进程不能再使用已被关 闭的通道;close操作描述符,其他进程仍然可以使用 该socket描述符 – close关闭应用程序与socket的接口,调用close之后进 程不能再读写这个socket;shutdown可以只关闭一个 通道,另一个通道仍然可以操作
2
2/40 Luobing Dong
主要内容
n 域名访问
n 高级socket函数
n 多路复用
n socket选项
3
3/40 Luobing Dong
域名访问
n 域名系统-DNS
l
域名
IP地址的别名,便于记忆 www.xidian.edu.cn-202.117.112.10
l
域名层次
域名层次树
10
10/40 Luobing Dong
域名访问
n 同时兼容域名和IP的应用程序
l
客户端程序client.c
… char *host=―202.112.8.2‖;//‖www.sina.com.cn‖ bzero(&srvaddr,sizeof(srvaddr)); srvaddr.sin_family=AF_INET; srvaddr.sin_port=htons(port); //if(inet_aton(host,&srvaddr.sin_addr)!=1) if(addr_conv(host,&srvaddr.sin_addr)==-1){ printf("addr convert fail\n"); return 1; }
h_name; **h_aliases; h_addrtype; h_length; **h_addr_list;
/*主机正式名称*/ /*别名列表,以NULL结束*/ /*主机地址类型:AF_INET*/ /*主机地址长度:4字节32位*/ /*主机网络地址列表,以NULL结束*/
h_addr_list[0]; //主机的第一个网络地址
l l
功能:关闭连接 参数:
sockfd-socket描述符 howto-指定关闭操作的类型
l
返回值:0-成功,-1失败
17
17/40 Luobing Dong
高级soFra Baidu bibliotekket函数
n int shutdown(int sockfd,int howto);
l
说明:
howto=0,关闭读通道,丢弃尚未读取的数据,
9
9/40 Luobing Dong
第一次查询 h_name:antares.sina.com.cn h_length:4 h_addrtype:2 h_aliase1:www.sina.com.cn ip1:202.112.8.2 ip2:202.205.3.130 ip3:202.205.3.142 ip4:202.205.3.143
域名访问
n 域名到IP的转换函数
l
查询www.sina.com.cn的结果
第二次查询 h_name:antares.sina.com.cn h_length:4 h_addrtype:2 h_aliase1:www.sina.com.cn ip1:202.205.3.142 ip2:202.205.3.143 ip3:202.112.8.2 ip4:202.205.3.130
sockfd-socket描述符
buf-发送或接收数据缓冲区 len-发送或接收数据长度 flags-发送或接收数据的控制参数
l
返回值:≥0-成功,-1失败
14/40
14
Luobing Dong
高级socket函数
n recv和send l 控制参数说明
flags=0,相当于read和write函数
客户端 应用程序
write shutdown(fd,1) write返回错误 read返回值>0
19
read返回值=0
write data
19/40
Luobing Dong
高级socket函数
n int shutdown(int sockfd,int howto);
l
说明:
howto=2,关闭读写通道,任何进程不能再操作
对后来接收到的数据返回确认后丢弃
客户端 客户端 应用程序 TCP协议 data read返回值>0 shutdown(fd,0) 关闭 读通道 read返回值=0 write data ack data read返回值>0
18/40 Luobing Dong
服务器 TCP协议
服务器 应用程序
write
write
高级socket函数
n int shutdown(int sockfd,int howto);
l
说明:
howto=1,关闭写通道,继续发送发送缓冲区未
发送完的数据,然后发送FIN字段关闭写通道
服务器端 服务器端 应用程序 TCP协议
data read返回值>0 FIN 关闭 写通道
客户端 TCP协议
flags=MSG_DONTROUTE,发送数据不查找路
由表,适用于局域网,或同一网段 flags=MSG_OOB,发送和接收带外数据
flags=MSG_PEEK,接收数据时不从缓冲区移
走数据,其他进程调用read或recv仍然可以读到 数据 flags=MSG_WAITALL,数据量不够时,读操作 等待,不返回,但在收到信号,连接端口时仍 然会结束。
13
13/40 Luobing Dong
高级socket函数
n recv和send
l l l l
int recv(int sockfd,void buf,int len, int flags); int send(int sockfd,void buf,int len,int flags); 功能:通过参数控制读写数据 参数:
l
返回值:有描述符就绪则返回就绪的描述 符个数;超时时间内没有描述符就绪返回0; 执行失败返回-1。
22
22/40 Luobing Dong
多路复用
n 多路复用函数select
l
参数:
maxfd-需要测试的描述符的最大值,实际测试
的描述符从0-maxfd-1
rdset-需要测试是否可读的描述符集合(包括
20
20/40 Luobing Dong
高级socket函数
n readv和writev
l
在一次函数调用中读、写多个非连续缓冲 区。有时也将这两个函数成为散布读和聚 集写
n recvmsg和sendmsg
l
类似于recv和send,但更强大 获取一个套接字的名字(地址)和端口
21
21/40 Luobing Dong
域名访问
n 域名到IP的转换函数
l
对同一DNS服务器两次调用 gethostbyname返回的IP地址列表顺序不 同 在不同的DNS服务器上查询,返回结果不 同 查询失败时错误类型保存在全局变量 h_errno中,函数hstrerror可以得到 h_errno的描述信息
l
l
gethostbyname是逐级查询,可能需要访问多个域名服务器, 会消耗较多时间,建议采用多进程(线程)处理
12/40 Luobing Dong
域名访问
n IP到域名的转换函数
l
struct hostent *gethostbyaddr(const char *addr,size_t len,int family);
功能:查询IP对应的域名
struct in_addr addr; inet_aton(―202.117.112.10‖,&addr); struct hostent *he=gethostbyaddr((char *)addr,4,AF_INET); if(he!=NULL){ printf("h_name:%s\n",he->h_name); } else printf("gethostbyaddr error:%s\n",hstrerror(h_errno));
l
域名服务器
存放域名和IP对应记录 提供域名查询功能
edu
com

cn
edu com … org xidian
4
4/40
Luobing Dong
域名访问
n 域名系统-DNS
l
域名查找过程
gethostname可以 参考RFC882、 RFC883实现
应用程序
调用函数 gethostbyname
函数 返回 UDP响应 本地域名服务器 UDP请求 其他域名服务器
解析器
解析器配置文件
5/40 Luobing Dong
5
域名访问
n 域名到IP的转换函数
l
struct hostent* gethostbyname(const char *name)
功能:查询域名对应的IP
struct hostent{ char char int int char } #define h_addr
处于listen状态的socket接收到连接请求)
wrset-需要测试是否可写的描述符集合(包括
以非阻塞方式调用connect是否成功)
exset-需要测试是否异常的描述符集合(包括
接收带外数据的socket有带外数据到达)
n getsockname和getpeername
l
多路复用
n 多路复用函数select l int select(int maxfd,fd_set *rdset,fd_set *wrest,fd_set *exset,struct timeval *timeout); l 功能:检查多个文件描述符(socket描述符) 是否就绪,当某一个描述符就绪(可读、 可写或发生异常)时函数返回。可以实现 输入输出多路复用
11/40
11
Luobing Dong
域名访问
n 同时兼容域名和IP的应用程序
l
地址转换函数addr_conv
int addr_conv(char *address, struct in_addr *inaddr){ struct hostent *he; if( inet_aton(address,in_addr) !=0) return 1; he = gethostbyname(address); if(he!=NULL){ *inaddr=*((struct in_addr *)he->h_addr_list[0]); return 1; } return -1; 12 }
网络应用程序设计
-高级socket函数
1
1/40 Luobing Dong
创建网络端点-socket
… //1.创建网络端点 int sockfd=socket(AF_INET, SOCK_STREAM, 0); if(sockfd==-1){ printf("can;t create socket\n"); exit(1); } …
相关文档
最新文档