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. android 获取经纬度

    android 定位的两种方式:GPS_PROVIDER and NETWORK_PROVIDER 定位的可以借助LocationManager来实现 MainActivity代码 static fi ...

  2. JS中手动触发事件的方法

    如果大家将一张网页看成一个form的话,大致上就成了一个web form的模型.在win form 下要想手动触发某一个对象的事件是很简单的,只要发送一条消息即可达成.(PostMessage) 但是 ...

  3. Openstack(八)部署镜像服务glance

    8.1glance镜像服务介绍 Glance是OpenStack镜像服务组件,glance服务默认监听在9292端口,其接收REST API请求,然后通过其他模块(glance-registry及im ...

  4. rtcp多媒体控制协议应用

    rtcp package send/recv demo main.c #include <stdio.h> #include <rtp.h> #include <rtcp ...

  5. 禁止或强制使用堆分配---《C++必知必会》 条款34

    有时候,指明一些特定类的对象不应该被分配到堆(heap)上是个好主意.通常这是为了确保该对象的析构函数一定会得到调用.维护对象本身(body object)的引用计数的句柄对象(handle obje ...

  6. SpringData环境搭建代码编写

    首先我们在前面的两节已经了解了SpringData是干什么用的?那我们从这节开始我们就开始编码测试SpringData. 1:首先我们从配置文件开始,我们首先需要写一个连接数据库的文件db.prope ...

  7. http之请求报文request

    https://blog.csdn.net/blueheart20/article/details/45174399 户端发送一个HTTP请求到服务器的请求消息包括以下格式: 请求行(request ...

  8. 2017-2018 ACM-ICPC Asia East Continent League Final (ECL-Final 2017) Solution

    A:Chat Group 题意:给出一个n, k 计算C(n, k) -> C(n,n) 的和 思路:k只有1e5 反过来想,用总的(2^ n) 减去 C(n, 0) -> C(n, k ...

  9. ac自动机系列

    hdu2222这题说的是在一个1000000的长串中找出n个短串是否在其中出现过 最后输出在长串中出现的个数 #include <iostream> #include <cstdio ...

  10. 用通俗的语言解释restful

    实现了REST规范的Web API就叫RESTful API. 简单来说:就是用url定位资源,用http描述来操作资源. web是什么:分布式信息系统为超文本文件和其他对象(资源)提供访问入口. 资 ...