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函数的调用方式。
    

网络编程I/O函数介绍的更多相关文章

  1. 基于TCP/IP协议的C++网络编程(API函数版)

    源代码:http://download.csdn.net/detail/nuptboyzhb/4169959 基于TCP/IP协议的网络编程 定义变量——获得WINSOCK版本——加载WINSOCK库 ...

  2. UNIX网络编程——使用select函数编写客户端和服务器

    首先看原先<UNIX网络编程--并发服务器(TCP)>的代码,服务器代码serv.c: #include<stdio.h> #include<sys/types.h> ...

  3. python网络编程调用recv函数完整接收数据的三种方法

    最近在使用python进行网络编程开发一个通用的tcpclient测试小工具.在使用socket进行网络编程中,如何判定对端发送一条报文是否接收完成,是进行socket网络开发必须要考虑的一个问题.这 ...

  4. Java网络编程的Java流介绍

    前言 网络程序所做的很大一部分工作都是简单的输入输出:将数据字节从一个系统移动到另一个系统.Java的I/O建立于流(stream)之上.输入流读取数据,输出流写入数据.过滤器流(filter)流可以 ...

  5. 【网络编程】——connect函数遇见EINTR的处理

    最近在公司项目中突然报错如下 “connect: Interrupted system call”, 经过查找代码发现是在创建 socket 中执行了 connect 函数失败导致.上网查阅资料发现这 ...

  6. 网络编程I/O功能介绍

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

  7. Linux 网络编程 入门-常用函数

    网络连接无外乎服务器和客户端两方面的编程. 对于服务器大致的流程是:1---调用socket函数创建套接字 2---调用bind函数分配IP地址和端口号 3---调用listsen函数将套接字转为可接 ...

  8. linux网络编程:splice函数和tee( )函数高效的零拷贝

    splice( )函数 在两个文件描述符之间移动数据,同sendfile( )函数一样,也是零拷贝. 函数原型: #include <fcntl.h> ssize_t splice(int ...

  9. Linux网络编程2——系统函数

    socket信息数据结构 #include <netinet/in.h> struct sockaddr { unsigned short sa_family; /*地址族*/ ]; /* ...

随机推荐

  1. Select触发事件

     案例1: <script type="text/JavaScript"> function gradeChange(){ var objS = document.ge ...

  2. centos vim编辑器 第八节课

    centos  vim编辑器  第八节课 其他编辑器: nanogeditemacs 腾讯云上的vim版本~ VIM - Vi IMproved ~ ~ version 7.4.629 ~ by Br ...

  3. mysql索引详解(转)

    什么是索引 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面的 ...

  4. HBase表预分区

    在创建Hbase表的时候默认一张表只有一个region,所有的put操作都会往这一个region中填充数据,当这个一个region过大时就会进行split.如果在创建HBase的时候就进行预分区则会减 ...

  5. 20145333《网络对抗》Exp2 后门原理与实践

    20145333<网络对抗>Exp2 后门原理与实践 1.基础问题回答 (1)例举你能想到的一个后门进入到你系统中的可能方式? 通过邮件发送,邮箱里经常受到一些陌生人发来的链接. 误入了一 ...

  6. 解决方案--duilib中edit获得鼠标焦点后右边框被覆盖

    用duilib做了一个登录框,用户名的输入使用的是edit控件. XML中是这样写的: <Edit name="subdomain_edit" tipvalue=" ...

  7. 'workspace' in VS Code

    What is a 'workspace' in VS Code? You can save settings at the workspace level and you can open mult ...

  8. 利用ES6中的Array.find/ Array.findIndex来判断数组中已存在某个对象

    前端开发过程中,我们会经常遇到这样的情景:比如选中某个指标obj,将其加入到数组checkedArr中({id: 1234, name: 'zzz', ...}),但是在将其选中之前要校验该指标是否已 ...

  9. SDOI2011_染色

    SDOI_染色 背景:很早就想学习树链剖分,趁着最近有点自由安排的时间去学习一下,发现有个很重要的前置知识--线段树.(其实不一定是线段树,但是线段树应该是最常见的),和同学吐槽说树剖的剖和分都很死板 ...

  10. Thinking in java note1

    Part information collecting from http://blog.csdn.net/leonliu06/article/details/78638841 1. 如果已经定义了一 ...