《UNIX网络编程 卷一》例子程序中所使用的包裹函数及部分常量
《UNIX网络编程 卷1》例子程序中所使用的包裹函数及部分常量
《UNIX网络编程 套接字联网API》这本书的示例中定义了许多包裹函数,它们的名称和标准函数一样,只是首字母变成大写字母;每个包裹函数完成实际的函数调用,检查返回值,并在发生错误时终止程序。
我在重写书上例子的时候,也仿照书上的方式,定义了许多包裹函数,提高程序的可读性(当然,我定义的包裹函数的错误处理没有书上例子这么详细了)
PS:这篇文章(博客)会持续更新。
文件my_unp_v1.h:它定义了一些常量,声明了所有的包裹函数
#ifndef MY_UNP_H_ #define MY_UNP_H_ #include <stdio.h> #include <stdarg.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <unistd.h> #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define MAXLINE 1024 #define LISTENQ 1024 #define SA struct sockaddr //错误处理函数,输出错误信息后退出程序 void error_quit(char *fmt, ...); //各类包裹函数 void Write(int fd, void *ptr, size_t nbytes); ssize_t Read(int fd, void *ptr, size_t nbytes); int Socket(int family, int type, int protocol); void Inet_pton(int family, const char *strptr, void *addrptr); void Connect(int fd, const struct sockaddr *sa, socklen_t salen); void Fputs(const char *ptr, FILE *stream); void Close(int fd); void Listen(int fd, int backlog); void Bind(int fd, const struct sockaddr *sa, socklen_t salen); int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr); const char *Inet_ntop(int family, const void *addrptr, char *strptr, size_t len); #endif
文件my_unp_v1.c:它定义了所有的包裹函数
#include "my_unp_v1.h" //此函数是在程序发生错误时被调用 //先输出字符串fmt,再根据errno输出错误原因(如果有的话),最后退出程序 //注:在多线程程序中,错误原因可能不正确 void error_quit(char *fmt, ...) { int res; va_list list; va_start(list, fmt); res = vfprintf(stderr, fmt, list); if( errno != 0 ) fprintf(stderr, " : %s", strerror(errno)); fprintf(stderr, "\n", list); va_end(list); exit(1); } ssize_t Read(int fd, void *ptr, size_t nbytes) { ssize_t n = read(fd, ptr, nbytes); if ( n == -1) error_quit("read error"); return n; } void Write(int fd, void *ptr, size_t nbytes) { if (write(fd, ptr, nbytes) != nbytes) error_quit("write error"); } void Close(int fd) { if (close(fd) == -1) error_quit("close error"); } void Fputs(const char *ptr, FILE *stream) { if (fputs(ptr, stream) == EOF) error_quit("fputs error"); } int Socket(int family, int type, int protocol) { int n = socket(family, type, protocol); if( n < 0) error_quit("socket error"); return n; } void Inet_pton(int family, const char *strptr, void *addrptr) { int n = inet_pton(family, strptr, addrptr); if( n < 0) error_quit("inet_pton error for %s", strptr); } void Connect(int fd, const struct sockaddr *sa, socklen_t salen) { if (connect(fd, sa, salen) < 0) error_quit("connect error"); } void Listen(int fd, int backlog) { if (listen(fd, backlog) < 0) error_quit("listen error"); } void Bind(int fd, const struct sockaddr *sa, socklen_t salen) { if (bind(fd, sa, salen) < 0) error_quit("bind error"); } int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr) { int n = accept(fd, sa, salenptr); if ( n < 0) error_quit("accept error"); return n; } const char *Inet_ntop(int family, const void *addrptr, char *strptr, size_t len) { const char *ptr = inet_ntop(family, addrptr, strptr, len); if ( ptr == NULL) error_quit("inet_ntop error"); /* sets errno */ return ptr; }