Linux 套接字socket的数据读写

一个套接字描述符和一个文件描述符很相似

当套接字建立好了以后,可以用read 和 write 函数像操作文件描述符一样操作套接字描述符。

而且还可以用fork函数建立更多的子进程,并且把套接字秒速符传给子进程们进行read write!

除了read,write 以外还有6个特殊的读写函数!

写:

#include<sys/socket.h>ssize_t send(int sockfd,const void* buf,size_t nbytes,int flags);

详解:

前三个参数和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<sys/socket.h>

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 一般数据被截断

原文地址:https://www.cnblogs.com/zzzPark/p/6408839.html