📄 45.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>123</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="19.htm">上一层</a>][<a href="46.htm">下一篇</a>]
<hr><p align="left"><small> <br>
Linux网络编程--6. 高级套接字函数 <br>
http://linuxc.51.net 作者:hoyt (2001-05-08 11:22:09) <br>
在前面的几个部分里面,我们已经学会了怎么样从网络上读写信息了.前面的一些函 <br>
数(read,write)是网络程序里面最基本的函数.也是最原始的通信函数.在这一章里面,我 <br>
们一起来学习网络通信的高级函数.这一章我们学习另外几个读写函数. <br>
6.1 recv和send <br>
recv和send函数提供了和read和write差不多的功能.不过它们提供 了第四个参数来控制 <br>
读写操作. <br>
int recv(int sockfd,void *buf,int len,int flags) <br>
int send(int sockfd,void *buf,int len,int flags) <br>
前面的三个参数和read,write一样,第四个参数可以是0或者是以下的组合 <br>
_______________________________________________________________ <br>
| MSG_DONTROUTE | 不查找路由表 | <br>
| MSG_OOB | 接受或者发送带外数据 | <br>
| MSG_PEEK | 查看数据,并不从系统缓冲区移走数据 | <br>
| MSG_WAITALL | 等待所有数据 | <br>
|--------------------------------------------------------------| <br>
MSG_DONTROUTE:是send函数使用的标志.这个标志告诉IP协议.目的主机在本地网络上面 <br>
,没有必要查找路由表.这个标志一般用网络诊断和路由程序里面. <br>
MSG_OOB:表示可以接收和发送带外的数据.关于带外数据我们以后会解释的. <br>
MSG_PEEK:是recv函数的使用标志,表示只是从系统缓冲区中读取内容,而不清楚系统缓冲 <br>
区的内容.这样下次读的时候,仍然是一样的内容.一般在有多个进程读写数据时可以使用 <br>
这个标志. <br>
MSG_WAITALL是recv函数的使用标志,表示等到所有的信息到达时才返回.使用这个标志的 <br>
时候recv回一直阻塞,直到指定的条件满足,或者是发生了错误. 1)当读到了指定的字节 <br>
时,函数正常返回.返回值等于len 2)当读到了文件的结尾时,函数正常返回.返回值小于 <br>
len 3)当操作发生错误时,返回-1,且设置错误为相应的错误号(errno) <br>
如果flags为0,则和read,write一样的操作.还有其它的几个选项,不过我们实际上用的很 <br>
少,可以查看 Linux Programmer's Manual得到详细解释. <br>
6.2 recvfrom和sendto <br>
这两个函数一般用在非套接字的网络程序当中(UDP),我们已经在前面学会了. <br>
6.3 recvmsg和sendmsg <br>
recvmsg和sendmsg可以实现前面所有的读写函数的功能. <br>
int recvmsg(int sockfd,struct msghdr *msg,int flags) <br>
int sendmsg(int sockfd,struct msghdr *msg,int flags) <br>
struct msghdr <br>
{ <br>
void *msg_name; <br>
int msg_namelen; <br>
struct iovec *msg_iov; <br>
int msg_iovlen; <br>
void *msg_control; <br>
int msg_controllen; <br>
int msg_flags; <br>
} <br>
struct iovec <br>
{ <br>
void *iov_base; /* 缓冲区开始的地址 */ <br>
size_t iov_len; /* 缓冲区的长度 */ <br>
} <br>
msg_name和 msg_namelen当套接字是非面向连接时(UDP),它们存储接收和发送方的地址 <br>
信息.msg_name实际上是一个指向struct sockaddr的指针,msg_name是结构的长度.当套 <br>
接字是面向连接时,这两个值应设为NULL. msg_iov和msg_iovlen指出接受和发送的缓冲 <br>
区内容.msg_iov是一个结构指针,msg_iovlen指出这个结构数组的大小. msg_control和 <br>
msg_controllen这两个变量是用来接收和发送控制数据时的 msg_flags指定接受和发送 <br>
的操作选项.和recv,send的选项一样 <br>
6.4 套接字的关闭 <br>
关闭套接字有两个函数close和shutdown.用close时和我们关闭文件一样. <br>
6.5 shutdown <br>
int shutdown(int sockfd,int howto) <br>
TCP连接是双向的(是可读写的),当我们使用close时,会把读写通道都关闭,有时侯我们希 <br>
望只关闭一个方向,这个时候我们可以使用shutdown.针对不同的howto,系统回采取不同 <br>
的关闭方式. <br>
howto=0这个时候系统会关闭读通道.但是可以继续往接字描述符写. <br>
howto=1关闭写通道,和上面相反,着时候就只可以读了. <br>
howto=2关闭读写通道,和close一样 在多进程程序里面,如果有几个子进程共享一个套接 <br>
字时,如果我们使用shutdown, 那么所有的子进程都不能够操作了,这个时候我们只能够 <br>
使用close来关闭子进程的套接字描述符. <br>
---------------------------------------------------------------------------- <br>
---- <br>
相关文章 关键词 <br>
Linux网络编程--5. 用户数据报发送 (2001-05-08 11:21:31) <br>
Linux网络编程--4. 完整的读写函数 (2001-05-08 11:20:52) <br>
Linux网络编程--3. 服务器和客户机的信息函数 (2001-05-08 11:20:14) <br>
Linux网络编程--2. 初等网络函数介绍(TCP) (2001-05-08 11:19:34) <br>
Linux网络编程--1. Linux网络知识介绍 (2001-05-08 11:16:55) <br>
樊强制作 欢迎分享 2001 <br>
<br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="19.htm">上一层</a>][<a href="46.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -