《Unix网络编程》中的错误处理函数

#include "net.h"

#include <syslog.h>   // syslog()   

int daemon_proc;

static void err_doit(int errnoflag, int level, const char *fmt, va_list ap)
{
    int errno_save, n;
    char buf[MAXLINE + 1];
    errno_save = errno;

#ifdef HAVE_VSNPRINTF
    vsnprintf(nuf, MAXLINE, fmt, ap);
#else
    vsprintf(buf, fmt, ap);
#endif

    n = strlen(buf);

    if (errnoflag)
        snprintf(buf + n, MAXLINE - n, ": %s", strerror(errno_save));

    strcat(buf, "\n");

    if (daemon_proc)
    {
        syslog(level, buf);
    }
    else
    {
        fflush(stdout);
          fputs(buf, stderr);
          fflush(stderr);
    }

    return;
}

void err_ret(const char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    err_doit(1, LOG_INFO, fmt, ap);
    va_end(ap);
    return;
}

void err_sys(const char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    err_doit(1, LOG_INFO, fmt, ap);
    va_end(ap);
    exit(1);
}

void err_dump(const char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    err_doit(1, LOG_ERR, fmt, ap);
    va_end(ap);
    abort();
    exit(1);
}

void err_msg(const char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    err_doit(1, LOG_INFO, fmt, ap);
    va_end(ap);
    return;
}

void err_quit(const char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    err_doit(1, LOG_INFO, fmt, ap);
    va_end(ap);
    exit(1);
}

原文地址:https://www.cnblogs.com/lnlin/p/9367147.html

时间: 2024-10-12 14:06:23

《Unix网络编程》中的错误处理函数的相关文章

Unix网络编程中的五种I/O模型_转

转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描述符.接受数据缓冲地址.大小传递给内核,但是如果此时 该与该套接口相应的缓冲区没有数据,这个时候就recvfrom就会卡(阻塞)在这里,知道数据到来的时候,再把数据拷贝到应用层,也就是传进来的地址空 间,如果没有数据到来,就会使该函数阻塞在那里,这就叫做阻塞I/O模型,如下图: 2. 非阻塞I/O模

网络编程中shut_down和close()函数的区别

在Linux C网络编程中,一共有两种方法来关闭一个已经连接好的网络通信,它们就是close函数和shutdown函数,它们的函数原型分别为: 1 #include<unistd.h> 2 int close(int sockfd) 3 //返回:0--成功, 1--失败 4   5 #include<sys/socket.h> 6 int shutdown(int sockfd, int howto) 7 //返回:0--成功, 1--失败 对一个tcp socket调用clos

一些在PHP网络编程中会遇到的函数简单介绍

PHP网络编程函数介绍 1.     Fgetcsv函数-解析读入的行并找出csv格式的字段. Fgetcsv函数可以解析读入的行并找出csv格式的字段,然后返回一个包含这些字段的数组. Fgetcsv()函数参数的说明: 参数 说明 Handle 必选参数.打开文件后返回文件标识指针 Length 必选参数.指定一行最多显示的字符数,该值大于csv文件最长行的字符数. Delimiter 可选参数.文件的分隔符 Enclosure 可选参数.文件的分隔符 [示例]获取文件中每行用逗号分隔后所获

Linux网络编程中EAGAIN错误和EINTR错误

在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中). 从字面上来看,是提示再试一次.这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作(对文件或socket)的时候.例如,以O_NONBLOCK的标志打开文件/socket/FIFO,如果你连续做read操作而没有数据可读.此时程序不会阻塞起来等待数据准备就绪返回,read函数会返回一个错误EAGAIN,提示你的应用程序现在没有数据可读请稍后再试.

Unix网络编程随手记——IP处理函数inet_aton()、gethostbyname()等

IP地址实质上就是一个32位的无符号整数,用如下结构体存放 1 struct in_addr 2 { 3 unsigned int s_addr; 4 }; 由于历史原因,虽然IP地址只是个标量,却用一个结构体来存储. 由于主机可以有不同的主机字节顺序,即大端机或小端机.但TCP/IP定义了统一的网络字节顺序,大端字节顺序. Unix提供了两个函数可在主机字节和网络字节间实现转换: 一.htonl()和ntohl() 在Linux系统下: #include <arpa/inet.h> 有些系统

UNIX网络编程——客户/服务器心搏函数 (转)

下面是关于回送客户和服务器程序开发一些简单的心搏函数.这些函数可以发现对端主机或到对端的通信路径的过早失效.         在给出这些函数之前我们必须提出一些警告.首先,有人会想到使用TCP的保持存活特性(SO_KEEPALIVE套接字选项)来提供这种功能,然而TCP得在连接已经闲置2小时之后才发送一个保持存活探测段.意识到这一点以后,他们的下一个问题是如何把保持存活参数改为一个小得多的值(往往是在秒钟的量级),以便更快的检测到失效.尽管缩短TCP的保持存活定时器参数在许多系统上确实可行,但是

Linux网络编程中tcp_server和tcp_client函数的封装

本文的主要目的是将server套接字和client套接字的获取,做一个简易的封装,使用C语言完成.   tcp_server   服务器端fd的获取主要分为以下几步: 1.创建socket,这一步仅仅创建一个socket,没有任何特性的属性. 2.绑定网卡和port,一块主机可能有多块网卡,如果我们使用INADDR_ANY,意味着后面接受的TCP连接可以绑定在任意一块网卡上. 例如某台主机的ip地址有两个:192.168.44.136.10.1.1.4,假设绑定的ip采用INADDR_ANY,端

UNIX网络编程中的描述字就绪条件

我们一直在讨论等待某个描述字准备好 I/O (读或写)或是其上发生一个待处理的异常条件(带外数据).尽管可读性和可写性对于普通文件这样的描述字显而易见,然而对于引起 select 返回套接口就绪的条件要更为复杂一些. 1.下列四个条件中的任何一个满足时,一个套接口准备好读: 该套接口接收缓冲区中的数据字节数大于等于套接口接收缓冲区低潮标记的当前大小.对这样的套接口的读操作将不阻塞并返回一个大于0 的值(也就是返回准备好读入的数据字节数).可以使用 SO_RCVLOWAT 套接口选项设置该套接口的

UNIX网络编程中的字节序问题

1.inet_pton 函数原型: inet_pton:将"点分十进制" -> "二进制整数" int inet_pton(int af, const char *src, void *dst); 这个函数转换字符串到网络地址,第一个参数af是地址簇,第二个参数*src是来源地址,第三个参数* dst接收转换后的数据. inet_pton 是inet_addr的扩展,支持的多地址族有下列: af = AF_INET src为指向字符型的地址,即ASCII的地址

UNIX网络编程3.5字节操纵函数3.7inet_pton,inet_ntop