《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;
}