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

    

版权声明:本文博客原创文章,博客,未经同意,不得转载。





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4635653.html,如需转载请自行联系原作者


相关文章
|
7天前
|
5G 网络安全 SDN
网络功能虚拟化(NFV)和软件定义网络(SDN):赋能5G网络灵活、智能演进的关键
网络功能虚拟化(NFV)和软件定义网络(SDN):赋能5G网络灵活、智能演进的关键
28 3
|
1月前
|
网络协议 C语言
C语言 网络编程(十三)并发的TCP服务端-以进程完成功能
这段代码实现了一个基于TCP协议的多进程并发服务端和客户端程序。服务端通过创建子进程来处理多个客户端连接,解决了粘包问题,并支持不定长数据传输。客户端则循环发送数据并接收服务端回传的信息,同样处理了粘包问题。程序通过自定义的数据长度前缀确保了数据的完整性和准确性。
|
1月前
|
网络协议 C语言
C语言 网络编程(十四)并发的TCP服务端-以线程完成功能
这段代码实现了一个基于TCP协议的多线程服务器和客户端程序,服务器端通过为每个客户端创建独立的线程来处理并发请求,解决了粘包问题并支持不定长数据传输。服务器监听在IP地址`172.17.140.183`的`8080`端口上,接收客户端发来的数据,并将接收到的消息添加“-回传”后返回给客户端。客户端则可以循环输入并发送数据,同时接收服务器回传的信息。当输入“exit”时,客户端会结束与服务器的通信并关闭连接。
|
1月前
|
C语言
C语言 网络编程(八)并发的UDP服务端 以进程完成功能
这段代码展示了如何使用多进程处理 UDP 客户端和服务端通信。客户端通过发送登录请求与服务端建立连接,并与服务端新建的子进程进行数据交换。服务端则负责接收请求,验证登录信息,并创建子进程处理客户端的具体请求。子进程会创建一个新的套接字与客户端通信,实现数据收发功能。此方案有效利用了多进程的优势,提高了系统的并发处理能力。
|
1月前
|
C语言
C语言 网络编程(九)并发的UDP服务端 以线程完成功能
这是一个基于UDP协议的客户端和服务端程序,其中服务端采用多线程并发处理客户端请求。客户端通过UDP向服务端发送登录请求,并根据登录结果与服务端的新子线程进行后续交互。服务端在主线程中接收客户端请求并创建新线程处理登录验证及后续通信,子线程创建新的套接字并与客户端进行数据交换。该程序展示了如何利用线程和UDP实现简单的并发服务器架构。
|
2月前
|
安全 网络安全 开发者
探索Python中的装饰器:简化代码,增强功能网络安全与信息安全:从漏洞到防护
【8月更文挑战第30天】本文通过深入浅出的方式介绍了Python中装饰器的概念、用法和高级应用。我们将从基础的装饰器定义开始,逐步深入到如何利用装饰器来改进代码结构,最后探讨其在Web框架中的应用。适合有一定Python基础的开发者阅读,旨在帮助读者更好地理解并运用装饰器来优化他们的代码。
|
2月前
|
存储 网络协议 网络虚拟化
解锁未来网络新纪元!NFV基础知识大揭秘,让你的网络功能秒变“变形金刚”!
【8月更文挑战第25天】网络功能虚拟化(NFV)正引领网络架构的重大变革。NFV通过虚拟化技术将传统专有硬件上的网络功能转移到标准IT设备上,实现软硬件解耦,提升灵活性与成本效益。其关键技术架构包括NFV基础设施(NFVI)、虚拟网络功能(VNF)及管理编排模块。NFV不仅降低了成本和能耗,还加快了业务创新速度,并支持资源共享。目前,NFV已广泛应用于固定和移动网络中,提供用户接入控制等多种服务,未来将在网络发展中扮演更重要角色。
56 4
|
2月前
|
JavaScript 网络协议 API
【Azure API 管理】Azure APIM服务集成在内部虚拟网络后,在内部环境中打开APIM门户使用APIs中的TEST功能失败
【Azure API 管理】Azure APIM服务集成在内部虚拟网络后,在内部环境中打开APIM门户使用APIs中的TEST功能失败
|
2月前
|
Java Spring XML
掌握面向切面编程的秘密武器:Spring AOP 让你的代码优雅转身,横切关注点再也不是难题!
【8月更文挑战第31天】面向切面编程(AOP)通过切面封装横切关注点,如日志记录、事务管理等,使业务逻辑更清晰。Spring AOP提供强大工具,无需在业务代码中硬编码这些功能。本文将深入探讨Spring AOP的概念、工作原理及实际应用,展示如何通过基于注解的配置创建切面,优化代码结构并提高可维护性。通过示例说明如何定义切面类、通知方法及其应用时机,实现方法调用前后的日志记录,展示AOP在分离关注点和添加新功能方面的优势。
38 0
|
2月前
|
数据采集 资源调度 JavaScript
Node.js 适合做高并发、I/O密集型项目、轻量级实时应用、前端构建工具、命令行工具以及网络爬虫和数据处理等项目
【8月更文挑战第4天】Node.js 适合做高并发、I/O密集型项目、轻量级实时应用、前端构建工具、命令行工具以及网络爬虫和数据处理等项目
38 5
下一篇
无影云桌面