网络编程I/O功能介绍
2015-07-10 14:33
639 查看
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函数的调用方式。
相关文章推荐
- .net反射(原:http://www.cnblogs.com/knowledgesea/archive/2013/03/02/2935920.html)
- 把系统的Spring3.2.1升级到4.1.0之后测试接口报NoSuchMethodError: javax.servlet.http.HttpServletResponse.getStatus()
- 一个简单的零配置命令行HTTP服务器 - http-server (nodeJs)
- lwip tcp_tw_pcbs list problem in tcp_slowtmr()
- WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿
- iOS判断网络状态
- HTTP权威指南(读书笔记) 1
- android 几种网络请求方式
- TCP之TIME_WAIT状态原理
- setDoOutput与setDoInout(HttpUrlConnection)
- Android网络框架-Volley(一) 工作原理分析
- App崩溃分析:如何监控http请求并做出优化
- tornado实现https访问功能
- STM32W108无线射频模块通用IO接口应用实例
- Android开发请求网络方式详解
- http://www.gaofeiyu.com/392
- iOS 开发中如何显示网络图片
- http响应Last-Modified和ETag以及asp.net web api实现
- http://s.click.taobao.com/v0TMvzx
- 为什么主机或网络字节序对字符串不影响结果