linux socket通信出错封装处理

wrap.c

#include <stdlib.h>
#include <errno.h>
#include <sys/socket.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 ((errno == ECONNABORTED) || (errno == EINTR))goto again;elseperr_exit("accept error");}return n;
}
int Bind(int fd, const struct sockaddr *sa, socklen_t salen)
{int n;if ((n = bind(fd, sa, salen)) < 0)perr_exit("bind error");return n;
}
int Connect(int fd, const struct sockaddr *sa, socklen_t salen)
{int n;if ((n = connect(fd, sa, salen)) < 0)perr_exit("connect error");return n;
}
int Listen(int fd, int backlog)
{int n;if ((n = listen(fd, backlog)) < 0)perr_exit("listen error");return n;
}
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 (errno == EINTR)goto again;elsereturn -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 (errno == EINTR)goto again;elsereturn -1;}return n;
}
int Close(int fd)
{int n;if ((n = close(fd)) == -1)perr_exit("close error");return n;
}
ssize_t Readn(int fd, void *vptr, size_t n)
{size_t nleft;ssize_t nread;char *ptr;ptr = vptr;nleft = n;while (nleft > 0) {if ( (nread = read(fd, ptr, nleft)) < 0) {if (errno == EINTR)nread = 0;elsereturn -1;} else if (nread == 0)break;nleft -= nread;ptr += nread;}return n - nleft;
}ssize_t Writen(int fd, const void *vptr, size_t n)
{size_t nleft;ssize_t nwritten;const char *ptr;ptr = vptr;nleft = n;while (nleft > 0) {if ( (nwritten = write(fd, ptr, nleft)) <= 0) {if (nwritten < 0 && errno == EINTR)nwritten = 0;elsereturn -1;}nleft -= nwritten;ptr += nwritten;}return n;
}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;} elsereturn -1;}*ptr = 0;return n;
}

wrap.h

#ifndef __WRAP_H_
#define __WRAP_H_
void perr_exit(const char *s);
int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr);
int Bind(int fd, const struct sockaddr *sa, socklen_t salen);
int Connect(int fd, const struct sockaddr *sa, socklen_t salen);
int Listen(int fd, int backlog);
int Socket(int family, int type, int protocol);
ssize_t Read(int fd, void *ptr, size_t nbytes);
ssize_t Write(int fd, const void *ptr, size_t nbytes);
int Close(int fd);
ssize_t Readn(int fd, void *vptr, size_t n);
ssize_t Writen(int fd, const void *vptr, size_t n);
ssize_t my_read(int fd, char *ptr);
ssize_t Readline(int fd, void *vptr, size_t maxlen);
#endif

linux socket通信出错封装处理相关推荐

  1. linux socket通信组件,Linux下socket简单通信

    #define MAXLINE 4096 /**************程序流程******************* 1 用socket()函数创建一个socket 2 用bind()绑定到一个本地 ...

  2. linux socket通信编程之c语言(客户端和服务器程序)

    最近在学习socket编程,在网上找到一个很好的实例,于是按自己的想把代码修改了一下,算半原创了~~~~ 要保存起来常复习呀~~~ /// //服务器端代码:server.c /// //本文件是服务 ...

  3. linux socket通信tcp,基于TCP协议的socket通信

    一.服务器端 1.创建serverSocket,即服务器端的socket,绑定指定的端口,并侦听此端口 ServerSocket server = new ServerSocket(8888); 2. ...

  4. Linux Socket通信 C/S模型

    代码片段(8) [代码] MySocket.h 01 #ifndef _MYSOCKET_0623_H 02 #define _MYSOCKET_0623_H 03   04 #include < ...

  5. socket通信和异常处理札记

    Linux socket通信出现CLOSE_WAIT状态的原因与解决方法 这个问题之前没有怎么留意过,是最近在面试过程中遇到的一个问题,面了两家公司,两家公司竟然都面到到了这个问题,不得不使我开始关注 ...

  6. Android Socket通信简单使用

    公司要实现一个简单的聊天功能,提前研究一下 Socket 通信,而公司的服务端功能又没有实现,所以这里就把服务端的功能放到一个界面实现了. 一.原生 Socket 通信 1.Activity 布局 简 ...

  7. python封装api linux_python Socket编程-python API 与 Linux Socket API之间的关系

    python socket编程 by SA19225409 地址协议家族 Python 支持 AF_UNIX. AF_NETLINK. AF_TIPC 和 AF_INET 家族 AF_UNIX 基于本 ...

  8. Linux 下socket通信终极指南(附TCP、UDP完整代码)

    linux下用socket通信,有TCP.UDP两种协议,网上的很多教程把两个混在了一起,或者只讲其中一种.现在我把自己这两天研究的成果汇总下来,写了一个完整的,适合初学者参考,也方便自己以后查阅. ...

  9. Linux实现多进/线程并发服务端Socket通信

    Linux实现多进/线程并发服务端Socket通信 多进程并发服务端 程序流程 服务端程序 客户端程序 运行结果 多线程并发服务端 程序流程 服务端程序 客户端程序 运行结果 附录(错误处理函数封装) ...

最新文章

  1. 楼主考南师计算机学硕,南京师范大学考研详解:据说这所学校不太好考?嗯,是真的!...
  2. leangoo项目管理软件应用场景
  3. 关于质粒,学生物的你应该知道的那些事儿
  4. Spring-学习笔记10【Spring事务控制】
  5. linux 如何让.开头的文件不隐藏_如何使用 BusyBox 制作Linux最小文件系统
  6. mysql 枚举_是否推荐使用MySQL的enum类型?
  7. 发微博/文章设计思路
  8. 看到go语言简介想到的
  9. mac下编译hadoop-3.0.3
  10. mysql存放lng lat_使用空间点类型在MySQL中存储Lat Lng值
  11. django2.0media用户上传文件配置及使用方法
  12. 在 Centos6/RHEL6 上恢复 ext4 文件系统下误删除的文件
  13. 全向轮运动特性分析(图片版)
  14. Python 语言程序设计(2)基本图形绘制
  15. 32. Magento log()方法
  16. 445端口不通经验总结
  17. vue.js安装步骤教程
  18. 最短路——迪杰斯特拉算法
  19. linux磁盘写保护怎么修改_linux
  20. 如何快速求出与n互素的数有多少个?

热门文章

  1. python判断三角形是否成立_Python判断三角形
  2. 将两个或多个数组进行合并
  3. 中国艾草行业供需前景与产销规模预测报告2022版
  4. vivox21android版本9升级,vivo X21是什么系统
  5. 利用Python 生成hash值
  6. java获取文件hash值_怎样用java获取到文件的hash值?
  7. freeswitch的event事件处理
  8. 有关程序员的笑话有哪些(转)
  9. python爬取微信群聊天信息_美女出没微信群 不是来聊天专门抢红包
  10. 简述供应商管理SRM系统