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函数实现的更多相关文章

  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. Following a Select Statement Through Postgres Internals

    This is the third of a series of posts based on a presentation I did at the Barcelona Ruby Conferenc ...

  2. ASP.NET MVC+EF框架+EasyUI实现权限管理系列

    http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开 ...

  3. unity, 由scriptableObject创建.asset

    由继承自scriptableObject的类X创建.asset文件. 假设类X的定义为: [System.Serializable] public class X : ScriptableObject ...

  4. sp_change_users_login解决孤立用户问题

    孤立帐户,指的是某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中却没有对应的记录. 孤立帐户的产生一般是一下两种: ...

  5. PicPopupWindow的使用

    Github地址https://github.com/lujianfeiccie/android_picpopup_window 效果图1: 效果图2:

  6. mac android studio 编译时报Class JavaLaunchHelper is implemented in both

    Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Cont ...

  7. windows 代理服务器的搭建,提供Android 端访问公网.

    这段时间遇到一个情况,移动的网络收费.但是可以访问学校内部的网络,比如说学校官网图书馆之类了.所以我这里便想到一个方法,用学校内部一个可以访问互联网的主机充当代理服务器(我这里使用自己的电脑,非服务器 ...

  8. coderforces719b

    题目大意:给定一个字符串,这个字符串中只有“r”和"b"组成,每次操作只能交换两个字符的位置或者将一个字符由"r"变"b"(或由" ...

  9. java io流 数据流传输

    java io流 数据流传输 把这段当公式用就可以了 //数据流传输 import java.io.*; public class Index{ public static void main(Str ...

  10. (JS实现顾客商品浏览记录以及购物车)Cookie的保存与删除

    //JS实现顾客浏览商品的记录以及实现购物车的功能function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.s ...