zoukankan      html  css  js  c++  java
  • 网络编程I/O函数介绍

    read和write

    #include <unistd.h>
    ssize_t read(int fd, void *buf, size_t count);
    ssize_t write(int fd, const void *buf, size_t count);

    参数:

    fd: 文件描述符
    buf:数据缓冲区,用于保存要从fd读取或写入的数据
    count:输入/写入的数据最大字节数。(实际读取或写入的数据大小可能小于count)

    返回值:
    正常情况下返回读取或写入的真正的数据大小
    返回0表示没有数据被读取到或写入
    -1:函数调用错误,errno值会被设置

    readv和writev

    #include <sys/uio.h>
    ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
    ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
    根据iov预先制定的格式读取或写入数据。
    相当于写数据块,并且可以制定数据块的大小。
    具体参考结构体struct iovec

    send和recv

    send和recv用于已经建立连接的套接字通信(UDP也有已连接的)
    #include <sys/types.h>
    #include <sys/socket.h>
    ssize_t send(int sockfd, const void *buf, size_t len, int flags);
    ssize_t recv(int sockfd, void *buf, size_t len, int flags);
    前面三个参数类似于read和write。

    flags 参数有如下的选择:
    MSG_DONTROUTE 勿将数据路由出本地网络
    MSG_DONTWAIT 允许非阻塞操作(等价于使用O_NONBLOCK)
    MSG_EOR 如果协议支持,此为记录结束
    MSG_OOB 如果协议支持,发送带外数据
    MSG_NOSIGNAL 禁止向系统发送异常信息
    返回值
    成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno 中。

    recvfrom和sendto

    原型
    #include <sys/types.h>
    #include <sys/socket.h>
    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
    ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
    参数:
        前面三个参数与read/write的三个参数类似,分别表示文件描述符,数据缓冲区,最大读取/写入的数据大小
        flags: 与send和recv一样
        src_addr:数据报发送者的协议地址的套接字地址结构
        dest_addr:数据报要发送的目的地协议地址的套接字地址结构
        addrlen,前一个参数的大小
    返回值:
        真正发送/接收的数据的大小

    注意点:
        我们可以看到,sendto和recvfrom函数均含有一个跟对端地址相关的参数(src_addr, dest_addr),因此可以再没有建立连接的网络通信(UDP)中使用。这里sockfd只需要通过socket()进行创建,而不一定需要connect()进行连接。(不需要不代表不能,后面进一步介绍)
        在一些时候,我们需要使用connect()为UDP通信建立连接,(因为UDP是不可靠的,但我们却想要将异步错误返回)。这里的连接于TCP的连接时不一样的。UDP的connect相当于TCP的connect的重载,它没有三次握手的过程,更倾向于绑定的概念。UDPconnect()只是将套接字与IP地址进行连接绑定。
        使用有连接的UDP通信时,我们一般不适用sendto和recvfrom,而使用send和recv等函数。如非要使用sendto和recvfrom,则src_addr,dest_addr,参数必须为NULL,len必须为0



    recvmsg和sendmsg

    #include <sys/types.h>
    #include <sys/socket.h>
    ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
    ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
    类似于readv和writev。参考msghdr结构体


    笔记:

        如果套接口为SOCK_STREAM类型,并且远端“优雅”地中止了连接(发送端send后立即关闭套接字,还没测试),那么recv()一个数据也不读取,立即返回。如果立即被强制中止,那么recv()将以WSAECONNRESET错误失败返回。flags参数和套接字选项都会影响到网络I/O函数的调用方式。
        
  • 相关阅读:
    测试常用的sql语句总结
    测试常用的Linux命令总结
    【转载】vim 中如何替换选中行或指定几行内的文本
    1074 Reversing Linked List
    1077 Kuchiguse
    LC 355. Design Twitter
    LCP 5. 发 LeetCoin
    LC 1409. Queries on a Permutation With Key
    1095 Cars on Campus
    LC 1369. Get the Second Most Recent Activity
  • 原文地址:https://www.cnblogs.com/Windeal/p/4284612.html
Copyright © 2011-2022 走看看