转载自:https://blog.csdn.net/libochun3217/article/details/9095569
感谢大佬
添加ssize_t Readline(int fd,void *vptr,size_t maxlen);函数

wrap.h

#ifndef WRAP_H
#define WRAP_H #include <stdlib.h>
#include <errno.h>
#include <sys/socket.h> void perr_exit(const char *s); int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr);
void Bind(int fd, const struct sockaddr *sa, socklen_t salen);
void Connect(int fd, const struct sockaddr *sa, socklen_t salen);
void Listen(int fd, int backlog); int Socket(int family, int type, int protocol);
void Close(int fd); ssize_t Readline(int fd,void *vptr,size_t maxlen);
ssize_t Read(int fd, void *ptr, size_t nbytes);
ssize_t Write(int fd, const void *ptr, size_t nbytes); ssize_t Readn(int fd, void *vptr, size_t n);
ssize_t Writen(int fd, const void *vptr, size_t n); #endif

wrap.c

#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"
#include "sys/socket.h"
#include "ctype.h"
#include "arpa/inet.h"
#include "wrap.h" void perr_exit(const char *s)
{ perror(s); exit(1);
} int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr)
{ int n; again: if((n = accept(fd, sa, salenptr)) < 0) { if((ECONNABORTED == errno) || (EINTR == errno)) goto again; else perr_exit("accept error"); } return n;
} void Bind(int fd, const struct sockaddr *sa, socklen_t salen)
{ if(bind(fd, sa, salen) < 0) perr_exit("bind error");
} void Connect(int fd, const struct sockaddr *sa, socklen_t salen)
{ if(connect(fd, sa, salen) < 0) perr_exit("connect error");
} void Listen(int fd, int backlog)
{ if(listen(fd, backlog) < 0) perr_exit("listen error");
} int Socket(int family, int type, int protocol)
{ int n; if((n = socket(family, type, protocol)) < 0) perr_exit("socket error"); return n;
} ssize_t Read(int fd, void *ptr, size_t nbytes)
{ ssize_t n; again: if((n = read(fd, ptr, nbytes)) == -1) { if(EINTR == errno) goto again; else return -1; }    return n;
} ssize_t Write(int fd, const void *ptr, size_t nbytes)
{ ssize_t n; again: if((n = write(fd, ptr, nbytes)) == -1) { if(EINTR == errno) goto again; else return -1; } return n;
} void Close(int fd)
{ if(close(fd) == -1) perr_exit("close error");
} ssize_t Readn(int fd, void *vptr, size_t nbytes)
{ size_t nleft; size_t nread; char *ptr; ptr = vptr; nleft = nbytes; while(nleft > 0) { if((nread = read(fd, ptr, nleft)) < 0) { if(EINTR == errno)     nread = 0; else return -1; } else if(nread == 0) break; nleft -= nread; ptr += nread; } return (nbytes-nleft);
} static ssize_t my_read(int fd,char *ptr)
{static int read_cnt;static char * read_ptr;static char read_buf[100];if(read_cnt <= 0){again:if((read_cnt == read(fd,read_buf,sizeof(read_buf))) < 0){if(errno == EINTR)goto again;return -1;}else if(read_cnt == 0)return 0;read_ptr = read_buf;}read_cnt--;*ptr = *read_ptr++;return 1;
}ssize_t Readline(int fd,void *vptr,size_t maxlen)
{ssize_t n,rc;char c,*ptr;ptr = vptr;for(n = 1;n < maxlen;n ++){if((rc = my_read(fd,&c)) == 1){*ptr++ = c;if(c == '\n')break;}else if(rc == 0){*ptr = 0;return n - 1;}else{return -1;}}*ptr = 0;return n;
}ssize_t Writen(int fd, const void *vptr, size_t nbytes)
{ size_t nleft; size_t nwritten; const char *ptr; ptr = vptr; nleft = nbytes; while(nleft > 0) { if((nwritten = write(fd, ptr, nleft)) <= 0) {    if(nwritten < 0 && EINTR == errno) nwritten = 0; else return -1; } nleft -= nwritten; ptr += nwritten; } return nbytes;
}

Linux 网络编程 wrap.c和wrap.h相关推荐

  1. Linux网络编程——黑马程序员笔记

    01P-复习-Linux网络编程 02P-信号量生产者复习 03P-协议 协议: 一组规则. 04P-7层模型和4层模型及代表协议 分层模型结构: OSI七层模型: 物.数.网.传.会.表.应TCP/ ...

  2. Linux网络编程---I/O复用模型之epoll

    https://blog.csdn.net/men_wen/article/details/53456474 Linux网络编程-I/O复用模型之epoll 1. epoll模型简介 epoll是Li ...

  3. Linux网络编程---I/O复用模型之poll

    https://blog.csdn.net/men_wen/article/details/53456474 Linux网络编程-I/O复用模型之poll 1.函数poll poll系统调用和sele ...

  4. Linux网络编程---I/O复用模型之select

    https://blog.csdn.net/men_wen/article/details/53456435 Linux网络编程-I/O复用模型之select 1. IO复用模型 IO复用能够预先告知 ...

  5. linux网络编程(三)select、poll和epoll

    linux网络编程(三)select.poll和epoll 一.为什么会有多路I/O转接服务器? 二.select 三.poll 三.epoll 一.为什么会有多路I/O转接服务器? 为什么会有多路I ...

  6. linux网络编程(二)高并发服务器

    linux网络编程(二)高并发服务器 错误处理 高并发服务器 多进程并发服务器 客户端 错误处理 #include "wrap.h"int Bind(int fd, const s ...

  7. Linux网络编程-七

    Linux网络编程-七 web服务器项目 1 web服务器开发准备 1.1 Html语言基础(和Markdown一个性质,某些程度上和Markdown通用,所以我在编辑的时候在<>里都加了 ...

  8. Linux网络编程——千峰物联网笔记

    B站视频:千峰物联网学科linux网络编程 网址:https://www.bilibili.com/video/BV1RJ411B761?p=1 目录 第一章:计算机网络概述 1.1计算机网络发展简史 ...

  9. Linux网络编程3——多进/线程并发服务器

    视频链接 黑马程序员-Linux网络编程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1iJ411S7UA?p=37 目录 一.高并发服务器 1.1 图 ...

  10. Linux网络编程--进程间通信(一)

    进程间通信简介(摘自<Linux网络编程>p85) AT&T 在 UNIX System V 中引入了几种新的进程通讯方式,即消息队列( MessageQueues),信号量( s ...

最新文章

  1. 批量从apk文件中提取出so文件
  2. python3爬虫小型代码_python3简单爬虫实现代码
  3. es中的Plugin机制
  4. IOS delegate 委托 使用 两个View之间传数据
  5. Android mock单例对象,如何对Java单例模式进行mock
  6. Shell 编程:Bash空格的那点事
  7. Chrome Vimium 快捷键
  8. Mac Chrome 安装插件(无VPN)
  9. LimeSDR新手入门教程(一)
  10. 【转】MUD教程--巫师入门教程4
  11. 钉钉直播 — 为什么直播屏幕共享显示黑屏?(仅针对mac端)
  12. Linux WIFI 驱动
  13. 资本寒冬,毕业不满一年被裁,失业后我们如何自渡?
  14. 系分 - 操作系统 - 嵌入式
  15. Xbox手柄转子马达的控制运用机制原理
  16. aria服务器没有响应,aria2服务器错误
  17. 电路中VCC、VDD、VEE和VSS的区别
  18. Mac的日历事件如何同步更新到iphone手机中?
  19. 保罗·艾伦去世:他是微软帝国缔造者,最慷慨的慈善家
  20. 利用WebBrower封装的自己的浏览器MyIE源代码

热门文章

  1. 虚拟机(Centos6.8)离线情况下,安装火狐浏览器
  2. 5 个骚气满满的项目,诞生了!
  3. kill -9 PID无法杀死一个进程
  4. Oracle行转列 pivot函数 常见用法
  5. C# 对象作为参数_试析C#编程语言的特点及功能
  6. 二分查找的时间复杂度
  7. 从三国学驾驭人才 --《回归人本》
  8. 字体图标,渐变,变形
  9. php do while(),php do while用法详解
  10. Android毛玻璃(磨砂)效果(静态&动态背景图模糊 收集)