网络编程学习_其他IO函数

本文为UNP14章学习笔记

一: 套接字超时: 一般通过select的timeout参数实现(timeout=NULL阻塞, =0的timeval非阻塞, 非0timeval超时)

fd_set rset;
FD_ZERO(&rset);
FD_SET(&rset,fd);
timaval t;
t.tv_sec=5;
t.tv_usec=0;
int ret = select(&rset,NULL,NULL,&t);
if(ret=0)
   printf("timeout!\n");
else
   read(fd,buf,buflen);

二, recv和send 函数

#include <sys/socket.h>

ssize_t recv(in fd, void* buf, size_t len,int flags);

ssize_t send(int fd, const void* buff, size_t len, int flags);

这两个函数币read/write 多了一个flags参数,用来设置模式,一般情况下设为0,其中可能用到的的有:

MSG_DONTWAIT: 仅本次操作阻塞

MSG_PEEK:查看收到的数据, 而这些数据不会被丢弃(即可以多次recv), 经常与MSG_DONTWAIT同时使用

MSG_WAITALL: 等待所有数据, 可用于实现"等到某个固定数目的数据可读为止" 的需求

三,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);

struct iovec{

void* iov_base;

size_t iov_len;

};

这两个函数被称为分散读/集中写

readv 会一次读入多个buf, 并且总是读满一个再读入下一个

writev 将多个buf中的数据写出去, 起重要应用是可以避免TCP的Negle算法


四:标准C函数

可以用fdopen打开一个fd来获得一个FILE*, 但是每次读写操作必须要进行fflush操作

这样做的其中一个好处是可以用fprintf来直接输出/输入格式化信息,(从而省掉缓冲区)

不过最好不要这样用~, 以避免一些可能奇怪的问题.




你可能感兴趣的:(网络编程学习_其他IO函数)