一个套接字描述符和一个文件描述符很相似
当套接字建立好了以后,可以用read 和 write 函数像操作文件描述符一样操作套接字描述符。
而且还可以用fork函数建立更多的子进程,并且把套接字秒速符传给子进程们进行read write!
除了read,write 以外还有6个特殊的读写函数!
写:
#include
详解:
前三个参数和write函数差不多,但是第四个参数就指示了send 的传输数据的方式:
MSG_CONFIRM 提供链路层反馈以保持地址映射有效
MSG_DONTROUTE 勿将数据包路由出本地网络
MSG_DONTWAIT 允许非阻塞行为 - -
MSG_EOF 标记记录结束
MSG_MORE 允许延迟并写更多数据
MSG_NOSIGNAL 在无连接的套接字不产生信号SIGPIPE
MSG_OOB 允许发送带外数据
对于报文数据发送,假如报文过长会导致错误。
对于字节流,则会阻塞到数据发送完成。
ssize_t sendt(int sockfd,const void *buf,size_t nbyte,int flags,
const struct sockaddr* destaddr,socklen_t destlen);
和send差不多,但是多了两个参数,地址结构和地址长度!所以发送时可以不用连接直接往这个地址发送!
ssize_t sendmsg(int sockfd,const struct msghdr *msg,int flags);
这个也和send 差不多就是多了一个msghdr 数据结构,可以指定一个msghdr来多重缓冲区传送数据。
struct msghdr{
void *msg_name;
socklen_t msg_namelen;
int msg_iovlen;
void *msg_control
socklen_t msg_controllen;
int msg_flags;
...}
读:
#include
ssize_t recv(int sockfd,void *buf,size_t mbytes,int flags);
读除了read 以外还有recv!recv和read极为相似只不过有一点不同的是。
recv 可以指定标识符来控制如何接受数据。
MSG_CMSG_CLOEXEC
MSG_DONTWAIT 不阻塞的操作
MSG_ERRQUEUE 接受错误信息作为辅助数据
MSG_OOB 获取带外数据
MSG_PEEK 返回数据包内容而已不拿走
MSG_TRUNC 返回数据包实际长度即使被截断
MSG_WAITALL 等到所有数据可用
有几个点需要注意:
当用MSG_PEEK的时候仅仅是查看不是取走,再次使用read的时候还是刚刚的数据。
对于数据量少于预期而言,MSG_WAITALL可以让避免等待,让数据全部返回后就返回函数值。
ssize_t recvfrom(int sockfd,void *buf,size_t len,int flags
struct sockaddr addr,socklen_t addrlen);
如果有兴趣定位数据发送者就使用这个。
ssize_t recvmsg(int sock,struct msghdr *msg,int flags);
如果想让接受的数据输入多个缓冲区就可以指定这个。flags 则指定标识符来指定接受数据的行为!
MSG_CTRUNC 控制数据被截断
MSG_EOR 接收记录结束符
MSG_ERRQUEUE 接受错误信息作为辅助数据
MSG_OOB 接受带外数据
MSG_TRUNC 一般数据被截断