1.recv()函数接收数据
#include<sys/types.h>
#include<sys/socket.h>
ssize_t recv(int s,void* buf,size_t len,int flags);
注:
s:socket()返回的文件描述符.
buf:套接字s中接收的数据放到buf缓冲区.
len:接收buf的大小.
flag:操作方式,如下图
recv()的返回值:
成功返回,返回成功接收的字节数
返回值为-1,查看errno,可以获取错误码,如图
当另一方正常关闭连接,返回值为0,例如调用close()关闭连接.
recv()函数常用于TCP类型的套接字,UDP使用recvfrom()函数接收数据.在数据报套接字绑定地址和端口后,也可以使用recv()函数接收数据.
recv()函数从内核的接收缓冲区中复制数据到用户指定的缓冲区.
当内核中的数据 < 指定的缓冲区,(未使用MSG_WAITALL标志),会复制缓冲区所有数据到用户缓冲区,并返回数据的长度.
当内核中的数据 > 指定的缓冲区,内核中多余的数据需要下次调用接收函数再复制.内核在复制用户指定的数据之后,会销毁已复制完毕的数据,并进行调整.
2.send()函数发送数据
#include<sys/types.h>
#include<sys/socket.h>
ssize_t send(int s,const void* buf,size_t len,int flags);
注:
s:socket()返回的文件描述符.
buf:套接字s中发送的数据放到buf缓冲区.
len:发送buf的大小.
flag:操作方式
用户缓冲区buf的数据通过send()函数不一定能够全部发送出去,要检查send()函数的返回值是否与计划的len的大小相同.
当send()函数返回值 < len,表示buf中有部分数据没成功发送,需要重新发送剩余数据.剩余数据发送需要对buf中的数据进行偏移,偏移大小为已成功发送的字节数.
send()发送错误,返回值为-1,查看errno获取错误码,当另一方正常关闭连接,返回值为0,例如调用close()关闭连接.
send()只能用于套接字处于连接状态的描述符,必须先connect()或其他函数连接,send()与write()区别在于发送方式flag.当flag为0,send()与write()一样.
send(s,buf,len,flag)等价于sendto(s,buf,len,flags,NULL,0)
3.readv()函数接收数据
#include<sys/uio.h>
ssize_t readv(int s,const struct iovec* vector,int count);
注:readv()可以接收多个缓冲区数据,从s中读取count块数据放到缓冲区向量vector中.
返回值成功返回接收的字节数,错误返回-1,查看errno获取错误码
调用readv()时,必须指定iovec的iov_base的长度iov_len,参数vector指向一块结构vector的内存,大小为count,vector的成员变量iov_base指向内存空间,iov_len为内存长度.阴影部分表示需要设置的vector成员变量的值.
4.writev()函数发送数据
#include<sys/uio.h>
ssize_t writev(int s,const struct iovec* vector,int count);
注:readv()可以接收多个缓冲区数据,向s中写入在向量vector中保存的count块数据.
返回值成功返回发送的字节数,错误返回-1,查看errno获取错误码
调用writev()时,必须指定iovec的iov_base的长度iov_len,参数vector指向一块结构vector的内存,大小为count,vector的成员变量iov_base指向内存空间,iov_len为内存长度.阴影部分表示需要设置的vector成员变量的值.与readv()区别是,writev()的vector函数内存空间的值已经设定好了.
5.recvmsg()函数接收数据
(1)recvmsg()含义
recvmsg()比recv(),readv()更复杂.
#include<sys/types.h>
#include<sys/socket.h>
ssize_t recvmsg(int s,struct msghdr* msg,int flags);
注:从s中接收数据放到缓冲区msg中,msg长度为len,操作方式flags.
返回值:成功返回接收的字节数,错误返回-1,errno获取错误码,当另一方正常关闭连接,返回值为0,例如调用close()关闭连接.
(3).recvmsg()用户空间与内核空间的交互
recv()函数从内核的接收缓冲区中复制数据到用户指定的缓冲区.
当内核中的数据 < 指定的缓冲区,(未使用MSG_WAITALL标志),会复制缓冲区所有数据到用户缓冲区,并返回数据的长度.
当内核中的数据 > 指定的缓冲区,内核中多余的数据需要下次调用接收函数再复制.内核在复制用户指定的数据之后,会销毁已复制完毕的数据,并进行调整.
6.sendmsg()函数发送数据
#include<sys/uio.h>
ssize_t recvmsg(int s,struct msghdr* msg,int flags);
注:sendmsg()可以接收多个缓冲区数据,sendmsg()向s中按照结构msg的设定写入数据,操作方式flag.
sendmsg()与recvmsg()区别,sendmsg()操作方式由flag参数设定,recvmsg()操作方式由参数msg结构中成员变量msg_flag指定.
简述:
注释: 值 MSG_DONTROUTE MSG_OOB 返回值:
8.recvfrom()
|
注:sendto()和recvfrom()常用在UDP协议中
9.IO函数的比较