本文主要是介绍第十六章(二) 套接字初识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
数据传输:
尽管可以通过 read 和 write 交换数据,但这就是这两个函数所能作的一切。但是如果想要指定选项,从多个客户端接收数据包,或者发送带外数据,就需要使用6个为数据传递而设计的套接字函数。
三个传送数据的套接字函数:
<span style="color:#000000;">ssize_t send(int sockfd, void *buf, size_t nbytes, int flags)/*使用send时套接字必须已经连接与write不同的是,send支持第4个参数 flagsflags标识符的取值如下: 1、MSG_DONTROUTE 勿将数据路由出本地网络 2、MSG_DONTWAIT 允许非阻塞操作 3、MSG_EOR 如果协议支持,此为记录结束 4、MSG_OOB 如果协议支持,发送带外数据 即使send成功返回,也无法确定另一端一定接收到了数据,只能保证数据已经无错误的发送到网络驱动程序上。对于支持为报文设限的协议,若报文超过协议所支持的最大尺寸,send失败并将errno设为EMSGSIZE; 对于字节流协议,send会阻塞直到整个数据被传输; */</span>
ssize_t sendto(int sockfd, void *buf, size_t nbytes, int flags, struct sockaddr *destaddr, socklen_t destlen);//与send类似,但是区别在于此函数可以在无连接的套接字上指定一个目标地址//该函数通过指定目标地址允许在无连接的套接字之间发送数据,无连接的套接字之间通信不能使用send函数,除非connect时预先设定目标地址;
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags); //可以指定多重缓冲区传输数据
三个接收数据的套接字函数:
ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags); //该函数的功能类似与read函数,除了有标识符flags之外,其他的相同; /*flags标识符的取值如下: 1、MSG_PEEK 返回报文内容而不真正取走报文 2、MSG_TRUNC 即使报文被截断,要求返回的是报文的实际长度 3、MSG_WAITALL 等待直到所有数据可用 4、MSG_OOB 如果协议支持,发送带外数据 */
ssize_t recvfrom(int sockfd, void *buf, size_t nbytes, int flags, struct sockaddr *addr, socklen_t *addrlen); //若addr非空,它将包含数据发送者的套接字端点地址,该函数常用于无连接套接字;
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags); //将接受到的数据送入多个缓冲区
套接字选项
套接字机制提供了两个套接字选项接口来控制套接字行为。可以获取或设置以下3种选项:
1、通用选项,工作在所有套接字类型上
2、在套接字层次管理的选项,但是依赖于下层协议的支持
3、特定于某协议的选项,每个协议独有
int setsockopt(int sockfd, int level, int option, void *val, socklen_t len)/*函数用来设置套接字选项参数level标识了选项用的协议参数 val 根据level的不同指向一个数据结构或者一个整数。一些选项是 on/off 开关。若整数非0,则启用选项;为0即禁止参数len指定val对象大小*/
int getsockopt(int sockfd, int level, int option, void *val, socklen_t *lenp)//用于查看选项的当前值//调用函数前,设置该整数为复制选项缓冲区的长度,若实际大于此值,则选项被截断;若小于,则更新为实际值
带外数据
带外数据是一些通信协议所支持的可选功能,与普通数据相比,其具有更高优先级的数据传输。带外数据先行传输,即使传输队列已经有数据,
TCP支持带外传输,UDP不支持
TCP将带外数据称为紧急数据,但仅支持一个字节的紧急数据
如果通过套接字安排了信号的产生,那么紧急数据被接收时,会发送SIGURG信号
fcntl( sockfd, F_SETOWN, pid)
(pid为负表示为进程组,为正表示某个进程)
当然能用F_GETOWN来获取套接字所有权的进程
own = fcntl(sockfd, F_GETOWN, 0)
TCP支持紧急标记的概念。 若采用SO_OOBINLINE,那么可以在普通数据中接收紧急数据。
函数 int sockatmark(int sockfd)
用于判断是否已经到达了紧急数据
当下一个要读取的字节在紧急标识处时,返回1
这篇关于第十六章(二) 套接字初识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!