Linux网络编程-readn函数、writen函数、readline函数实现
readn函数功能:在网络编程的读取数据中,通常会需要用到一个读指定字节才返回的函数,linux系统调用中没有给出,需要自己封装。
readn实现代码:
- int readn(int fd, void *vptr, size_t n)
- {
- size_t nleft = n; //readn函数还需要读的字节数
- ssize_t nread = ; //read函数读到的字节数
- unsigned char *ptr = (char *)vptr; //指向缓冲区的指针
- while (nleft > )
- {
- nread = read(fd, ptr, nleft);
- if (- == nread)
- {
- if (EINTR == errno)
- nread = ;
- else
- return -;
- }
- else if ( == nread)
- {
- break;
- }
- nleft -= nread;
- ptr += nread;
- }
- return n - nleft;
- }
writen函数功能:读满n个字节才返回
writen代码实现:
- int writen(int fd, const void *vptr, size_t n)
- {
- size_t nleft = n; //writen函数还需要写的字节数
- ssize_t nwrite = ; //write函数本次向fd写的字节数
- const char* ptr = vptr; //指向缓冲区的指针
- while (nleft > )
- {
- if ((nwrite = write(fd, ptr, nleft)) <= )
- {
- if (nwrite < && EINTR == errno)
- nwrite = ;
- else
- return -;
- }
- nleft -= nwrite;
- ptr += nwrite;
- }
- return n;
- }
readline函数功能:读到'\n'或者读满缓冲区才返回
readline函数实现:
- static ssize_t readch(int fd, char *ptr)
- {
- static int count = ;
- static char* read_ptr = ;
- static char read_buf[*] = {};
- if (count <= )
- {
- again:
- count = read(fd, read_buf, sizeof(read_buf));
- if (- == count)
- if (EINTR == errno)
- goto again;
- else
- return -;
- else if ( == count)
- return ;
- read_ptr = read_buf;
- }
- count--;
- *ptr = *read_ptr++;
- return ;
- }
- ssize_t readline(int fd, void *vptr, size_t maxlen)
- {
- ssize_t i = ;
- ssize_t ret = ;
- char ch = '\0';
- char* ptr = NULL;
- ptr = (char *)vptr;
- for (i = ; i < maxlen; ++i)
- {
- ret = readch(fd, &ch);
- if ( == ret)
- {
- *ptr++ = ch;
- if ('\n' == ch)
- break;
- }
- else if ( == ret)
- {
- *ptr = ;
- return i-;
- }
- else
- return -;
- }
- *ptr = ;
- return i;
- }
Linux网络编程-readn函数、writen函数、readline函数实现的更多相关文章
- 网络编程readn、writen和readline函数的编写
readn 在Linux中,read的声明为: ssize_t read(int fd, void *buf, size_t count); 它的返回值有以下情形: 1.大于0,代表成功读取的字节 ...
- Linux 网络编程中的read和write函数正确的使用方式
字节流套接字上的read和write函数所表现的行为不同于通常的文件IO,字节流套接字上调用read和write输入或输出的可能比请求的数量少,然而这不是出错的状态,例如某个中端使read和write ...
- Linux网络编程——I/O复用之poll函数
一.回顾前面的select select优点: 目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点 select缺点: 1.每次调用 select(),都需要把 fd 集合从用户态拷贝到内核 ...
- linux网络编程中的shutdown()与close()函数
1.close()函数 int close(int sockfd); //返回成功为0,出错为-1 close 一个套接字的默认行为是把套接字标记为已关闭,然后立即返回到调用进程,该套接字不能再由cl ...
- Linux网络编程——tcp并发服务器(poll实现)
想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程——I/O复用之poll函数> 代码: #include <string.h> #include <st ...
- linux网络编程九:splice函数,高效的零拷贝
from:http://blog.csdn.net/jasonliuvip/article/details/22600569 linux网络编程九:splice函数,高效的零拷贝 最近在看<Li ...
- linux进程编程:子进程创建及执行函数简介
linux进程编程:子进程创建及执行函数简介 子进程创建及执行函数有三个: (1)fork();(2)exec();(3)system(); 下面分别做详细介绍.(1)fork() 函数定 ...
- 很全的linux网络编程技巧
本文转载自:http://www.cnblogs.com/jfyl1573/p/6476607.html 1. LINUX网络编程基础知识 1 1.1. TCP/IP协议概述 1 1.2. OSI参考 ...
- 【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"
[深入浅出Linux网络编程]是一个连载博客,内容源于本人的工作经验,旨在给读者提供靠谱高效的学习途径,不必在零散的互联网资源中浪费精力,快速的掌握Linux网络编程. 连载包含4篇,会陆续编写发出, ...
随机推荐
- 如果在代码中使用JS
protected void Page_Load(object sender, EventArgs e) { //获得.js文件 string myscript = ...
- Cellmap 基站查询 For Pc
cellmap for pc 6.2.8.3.0.9 在线版本 更新日期:2017年1月5日 下载地址:<地址一> 主页:www.cellmap.cn 特别声明:本软件不能手机定位.谨防受 ...
- import logging 导入记录日志包
import logging 日志几个级别 logging.debug logging.info logging.error
- JQuery AJAX 解析获得的JSON数据
下面的解析的Json是一个二级循环. <!DOCTYPE html> <html> <head> <script src="https://code ...
- iOS沙盒机制介绍,Block 的介绍
一.iOS沙盒机制介绍 (转载) 1)概念:每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用放入文件 系统隔离,ios系统不允许访问 其他应用的应用沙盒,但在ios8中已经开放访 ...
- Eclipse中FindBugs插件的应用
在以前的一个开发现场里,经常会收到客户的代码review指摘. 觉得有点神奇是,给客户的文件是编译后的*.class打成war包,客户那边却能指摘出代码中的缺陷bug,而且精确到代码的某一行. 通过* ...
- JSTL标签库中<c:choose></c:choose>不能放JSP页面<!-- -->注释
笔者最近在使用JSTL标签库的<c:choose>标签时候,发现在该标签体中加了JSP的<!-- -->注释时,总是会显示报错信息.错误的信息如下: <span styl ...
- tkprof
http://blog.csdn.net/pan_tian/article/details/7677338 需要调整的语句符合以下几点: (1).CPU占用过多 (2).Parse,Execute,F ...
- day6-3面向对象高阶
面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实 ...
- 用自己的ID在appstore中更新app-黑苹果之路
由于之前套用了别人的镜像,在appstore中更新XCode时总要输别人id的密码,id还不能改.网上有的说要把XCode删掉,然后再用自己的ID更新,找到另外一个方法,更简单: 1.打开引用程序目录 ...