readn函数功能:在网络编程的读取数据中,通常会需要用到一个读指定字节才返回的函数,linux系统调用中没有给出,需要自己封装。

readn实现代码:

  1. int readn(int fd, void *vptr, size_t n)
  2. {
  3. size_t nleft = n; //readn函数还需要读的字节数
  4. ssize_t nread = ; //read函数读到的字节数
  5. unsigned char *ptr = (char *)vptr; //指向缓冲区的指针
  6.  
  7. while (nleft > )
  8. {
  9. nread = read(fd, ptr, nleft);
  10. if (- == nread)
  11. {
  12. if (EINTR == errno)
  13. nread = ;
  14. else
  15. return -;
  16. }
  17. else if ( == nread)
  18. {
  19. break;
  20. }
  21. nleft -= nread;
  22. ptr += nread;
  23. }
  24. return n - nleft;
  25. }

writen函数功能:读满n个字节才返回

writen代码实现:

  1. int writen(int fd, const void *vptr, size_t n)
  2. {
  3. size_t nleft = n; //writen函数还需要写的字节数
  4. ssize_t nwrite = ; //write函数本次向fd写的字节数
  5. const char* ptr = vptr; //指向缓冲区的指针
  6.  
  7. while (nleft > )
  8. {
  9. if ((nwrite = write(fd, ptr, nleft)) <= )
  10. {
  11. if (nwrite < && EINTR == errno)
  12. nwrite = ;
  13. else
  14. return -;
  15. }
  16. nleft -= nwrite;
  17. ptr += nwrite;
  18. }
  19. return n;
  20. }

readline函数功能:读到'\n'或者读满缓冲区才返回

readline函数实现:

  1. static ssize_t readch(int fd, char *ptr)
  2. {
  3. static int count = ;
  4. static char* read_ptr = ;
  5. static char read_buf[*] = {};
  6.  
  7. if (count <= )
  8. {
  9. again:
  10. count = read(fd, read_buf, sizeof(read_buf));
  11. if (- == count)
  12. if (EINTR == errno)
  13. goto again;
  14. else
  15. return -;
  16. else if ( == count)
  17. return ;
  18. read_ptr = read_buf;
  19. }
  20. count--;
  21. *ptr = *read_ptr++;
  22. return ;
  23. }
  24.  
  25. ssize_t readline(int fd, void *vptr, size_t maxlen)
  26. {
  27. ssize_t i = ;
  28. ssize_t ret = ;
  29. char ch = '\0';
  30. char* ptr = NULL;
  31.  
  32. ptr = (char *)vptr;
  33.  
  34. for (i = ; i < maxlen; ++i)
  35. {
  36. ret = readch(fd, &ch);
  37. if ( == ret)
  38. {
  39. *ptr++ = ch;
  40. if ('\n' == ch)
  41. break;
  42. }
  43. else if ( == ret)
  44. {
  45. *ptr = ;
  46. return i-;
  47. }
  48. else
  49. return -;
  50. }
  51. *ptr = ;
  52. return i;
  53. }

Linux网络编程-readn函数、writen函数、readline函数实现的更多相关文章

  1. 网络编程readn、writen和readline函数的编写

    readn   在Linux中,read的声明为: ssize_t read(int fd, void *buf, size_t count); 它的返回值有以下情形: 1.大于0,代表成功读取的字节 ...

  2. Linux 网络编程中的read和write函数正确的使用方式

    字节流套接字上的read和write函数所表现的行为不同于通常的文件IO,字节流套接字上调用read和write输入或输出的可能比请求的数量少,然而这不是出错的状态,例如某个中端使read和write ...

  3. Linux网络编程——I/O复用之poll函数

    一.回顾前面的select select优点: 目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点 select缺点: 1.每次调用 select(),都需要把 fd 集合从用户态拷贝到内核 ...

  4. linux网络编程中的shutdown()与close()函数

    1.close()函数 int close(int sockfd); //返回成功为0,出错为-1 close 一个套接字的默认行为是把套接字标记为已关闭,然后立即返回到调用进程,该套接字不能再由cl ...

  5. Linux网络编程——tcp并发服务器(poll实现)

    想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程——I/O复用之poll函数> 代码: #include <string.h> #include <st ...

  6. linux网络编程九:splice函数,高效的零拷贝

    from:http://blog.csdn.net/jasonliuvip/article/details/22600569 linux网络编程九:splice函数,高效的零拷贝 最近在看<Li ...

  7. linux进程编程:子进程创建及执行函数简介

    linux进程编程:子进程创建及执行函数简介 子进程创建及执行函数有三个: (1)fork();(2)exec();(3)system();    下面分别做详细介绍.(1)fork()    函数定 ...

  8. 很全的linux网络编程技巧

    本文转载自:http://www.cnblogs.com/jfyl1573/p/6476607.html 1. LINUX网络编程基础知识 1 1.1. TCP/IP协议概述 1 1.2. OSI参考 ...

  9. 【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"

    [深入浅出Linux网络编程]是一个连载博客,内容源于本人的工作经验,旨在给读者提供靠谱高效的学习途径,不必在零散的互联网资源中浪费精力,快速的掌握Linux网络编程. 连载包含4篇,会陆续编写发出, ...

随机推荐

  1. 如果在代码中使用JS

    protected void Page_Load(object sender, EventArgs e)    {        //获得.js文件        string myscript = ...

  2. Cellmap 基站查询 For Pc

    cellmap for pc 6.2.8.3.0.9 在线版本 更新日期:2017年1月5日 下载地址:<地址一> 主页:www.cellmap.cn 特别声明:本软件不能手机定位.谨防受 ...

  3. import logging 导入记录日志包

    import logging 日志几个级别 logging.debug logging.info logging.error

  4. JQuery AJAX 解析获得的JSON数据

    下面的解析的Json是一个二级循环. <!DOCTYPE html> <html> <head> <script src="https://code ...

  5. iOS沙盒机制介绍,Block 的介绍

    一.iOS沙盒机制介绍 (转载) 1)概念:每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用放入文件 系统隔离,ios系统不允许访问 其他应用的应用沙盒,但在ios8中已经开放访 ...

  6. Eclipse中FindBugs插件的应用

    在以前的一个开发现场里,经常会收到客户的代码review指摘. 觉得有点神奇是,给客户的文件是编译后的*.class打成war包,客户那边却能指摘出代码中的缺陷bug,而且精确到代码的某一行. 通过* ...

  7. JSTL标签库中<c:choose></c:choose>不能放JSP页面<!-- -->注释

    笔者最近在使用JSTL标签库的<c:choose>标签时候,发现在该标签体中加了JSP的<!-- -->注释时,总是会显示报错信息.错误的信息如下: <span styl ...

  8. tkprof

    http://blog.csdn.net/pan_tian/article/details/7677338 需要调整的语句符合以下几点: (1).CPU占用过多 (2).Parse,Execute,F ...

  9. day6-3面向对象高阶

    面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实 ...

  10. 用自己的ID在appstore中更新app-黑苹果之路

    由于之前套用了别人的镜像,在appstore中更新XCode时总要输别人id的密码,id还不能改.网上有的说要把XCode删掉,然后再用自己的ID更新,找到另外一个方法,更简单: 1.打开引用程序目录 ...