linux网络编程基础API(二)
2014-06-26 20:28
477 查看
编写网络程序处除了要理解各种地址和必要的函数,还要检测程序出错。如果每次调用一个基本的socket函数都要判断其结果是否正确,会给编程带来麻烦。因此大多数都会定义包裹函数,对每一个基本socket函数进行封装。下面是借鉴了《linux C编程一站式学习》中的代码进行整理:
#include <stdlib.h> #include <errno.h> #include <sys/socket.h> #include <unistd.h> #include <stdio.h> #include "wrap.h" void perr_exit(const char *s) { perror(s); exit(1); } int Socket(int family, int type, int protocol) { int n; if ( (n = socket(family, type, protocol)) < 0) perr_exit("socket error"); return n; } void Connect(int fd, const struct sockaddr *sa, socklen_t salen) { if (connect(fd, sa, salen) < 0) perr_exit("connect error"); } void Bind(int fd, const struct sockaddr *sa, socklen_t salen) { if (bind(fd, sa, salen) < 0) perr_exit("bind error"); } void Listen(int fd, int backlog) { if (listen(fd, backlog) < 0) perr_exit("listen error"); } 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; else perr_exit("accept error"); } return n; } //有Readn就不用它了 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; else return -1; } return n; } //有Writen就不用它了 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; else return -1; } return n; } void Close(int fd) { if (close(fd) == -1) perr_exit("close error"); } //读n个字节到prt中,返回实际读到的字节数,-1代表出错 ssize_t Readn(int fd, void *vptr, size_t n) { size_t nleft; ssize_t nread; char *ptr; ptr = vptr; nleft = n;//剩下nleft未读 while (nleft > 0) { if ( (nread = read(fd, ptr, nleft)) < 0) { if (errno == EINTR) nread = 0; else return -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; else return -1; } nleft -= nwritten; ptr += nwritten; } return n; }
相关文章推荐
- 《Linux高性能服务器编程》学习笔记——第五章 Linux网络编程基础API(3)
- Linux下的网络编程API基础
- 《Linux高性能服务器编程》学习笔记——第五章 Linux网络编程基础API(4)
- Linux 高性能服务器编程——Linux网络编程基础API
- 《Linux高性能服务器编程》学习笔记——第五章 Linux网络编程基础API(1)
- Linux网络编程基础API(多线程实现)
- 5 Linux网络编程基础API
- 第二篇 深入解析高性能服务器编程 第5章 Linux 网络编程基础API
- Linux 高性能服务器编程——Linux网络编程基础API
- 《Linux高性能服务器编程》学习笔记——第五章 Linux网络编程基础API(2)
- Linux网络编程基础API
- socket 基础(Linux网络编程基础API)
- Linux 高性能服务器编程——Linux网络编程基础API
- 服务器编程入门(4)Linux网络编程基础API
- Linux高性能server编程——Linux网络基础API及应用
- 《Linux高性能服务器编程》学习笔记——第五章 Linux网络编程基础API(5)
- linux网络编程之TCP/IP基础(五):分析一帧基于UDP的TFTP协议帧
- 13、linux网络编程基础
- linux 网络编程基础
- 【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—基础知识篇