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

时间: 2024-08-01 17:35:18

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

1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client

 1  Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端口号"就称为socket. 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接.socket本身有"插座"的意思,因此用来描述网络连 接的一对一关系. TCP/IP协议最早在BSD UNIX上实现,

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

最近在公司项目中突然报错如下 “connect: Interrupted system call”, 经过查找代码发现是在创建 socket 中执行了 connect 函数失败导致.上网查阅资料发现这是 信号中断EINTR 与 慢系统调用 的问题. 慢系统调用:可能永远阻塞的系统调用. EINTR说明:如果进程在一个慢系统调用(slow system call)中阻塞时,当捕获到某个信号且相应信号处理函数返回时,这个系统调用被中断,调用返回错误,设置errno为EINTR(相应的错误描述为“In

17、第七周-网络编程 - 协程概念介绍、协程gevent模块并发爬网页

协程,又称微线程,纤程.什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈.因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置. 协程的好处: 无需线程上下文切换的开销 无需原子操作锁定及同步的开销(注解:"原子操作(atomic operation)是不需要synchr

Linux网络编程2&mdash;&mdash;系统函数

socket信息数据结构 #include <netinet/in.h> struct sockaddr { unsigned short sa_family; /*地址族*/ char sa_data[14]; /*14字节的协议地址,包含该socket的IP地址和端口号.*/ }; struct sockaddr_in { short int sa_family; /*地址族*/ unsigned short int sin_port; /*端口号*/ struct in_addr sin

linux网络编程:select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)

从别人的博客中转载过来了这一篇文章,经过重新编辑排版之后展现于此,做一个知识点保存与学习. select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型: int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 所在的头文件为:#include <sys/time.h> 和#include <uni

网络编程的一些函数

#include <sys/types.h>#include <sys/socket.h>函数原型:(创建一个套接口)int socket(int family,    // 协议类型,一般为AF_INET int type,      // socket类型:SOCK_STREAM.SOCK_DGRAM.SOCK_RAW.SOCK_PACKET.SOCK_SEQPACKET int protocol  // 用来指定socket所使用的传输协议编号,通常设为0即可,表示缺省 );

&lt;网络编程&gt;套接字介绍

1.端口:IANA(Internet Assigned Numbers Authority)维护着一个端口号分配状况的清单. 众所周知的端口(0-1023):由IANA分配和控制,可能的话,相同的端口号尽可能分配给TCP,UDP和STCP的同一给定服务 已登记的端口(1024-49151):这些端口不受IANA控制, 动态.私用的端口(49152-65535):临时端口. 2.套接字:一个套接字对是一个定义该连接的两个端点的四元组.{本地IP,本地TCP端口号,外地IP,外地TCP端口号} 套接

【Linux网络编程】IP地址介绍

什么是 IP 地址IP 地址(Internet Protocol Address)也称为网间地址.网际地址.IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写.IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异. IP 地址是?TCP/IP 协议栈?里的网络层地址方案,IP地址是一种用来对网络设备的逻辑标识. 举个生活中的例子,如果我要寄一

C/C++网络编程2——socket函数

本节主要介绍创建套接字的socket函数. #include <sys/socket.h> int socket(int domain, int type, int protocol); // 创建成功返回文件描述符,创建失败返回-1 domain : 套接字中使用的协议族 PF_INET : IPv4互联网协议族,常用的是这个 PF_INET6 : IPv6互联网协议族 PF_LOCAL : 本地通信的UNIX协议族 PF_PACKET : 底层套接字的协议族 PF_IPX : IPX No