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

  • 相关阅读:
    数学 之 hdu 4722
    DP + math 之 Codeforces 126D
    计算几何 之 hdu 1077 poj 1981 O(n^2logn)
    计算几何 之 hdu 1077 poj 1981 O(n^3)
    字典树 之 hdu 1800
    字典树 之 poj 1056
    字典树 之 hdu 4099
    字典树 之 hdu 1247
    解决java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date
    显示Mac壁纸所在路径以及接下来的事情你懂得
  • 原文地址:https://www.cnblogs.com/zzzPark/p/6408839.html
Copyright © 2020-2023  润新知