在netcat中,使用holler()函数与bail()函数来输出错误信息。
1 holler()函数
1.1 函数格式
holler()函数的格式为
void holler(char* str, char* p1 = NULL, char* p2 = NULL, char* p3 = NULL, char* p4 = NULL, char* p5 = NULL, char* p6 = NULL)
其中,参数str及p1-p6均为要输出的错误信息,其中p1-p6都有初始值,也就是说holler()函数可以使用1-7个参数均可,是一个“伪变参数的函数”。
1.2 函数实现
1.2.1 netcat是否带有-v参数
在holler()函数中,首先对变量o_verbose进行判断,如果netcat带有-v参数,即需要输出详细信息时,o_verbose的值是非零,否则为零。
if (o_verbose)
{
......
}
从代码中可以看出,只有当o_verbose的值是非零,即netcat带有-v参数时holler()函数才会起作用。
1.2.2 输出自定义的错误信息
当o_verbose的值是非零时,调用fprintf()函数,通过stderr输出自定义的错误信息。
fprintf(stderr, str, p1, p2, p3, p4, p5, p6);
其中,fprintf()和stderr请参考《C++中fprintf()函数与stdout、stderr》
1.2.3 输出网络套接字错误信息
if (h_errno)
{
fprintf(stderr, "%s\n", winsockstr(h_errno));
}
其中,h_errno是WSAGetLastError()函数的返回值,关于h_errno的详细讲解,请参考《Winsock套接字编程中的h_errno》
如果发生了网络套接字错误,则h_errno的值是零,则调用fprintf()函数,通过stderr输出错误信息。winsockstr()函数是自定义的函数,该函数的格式为
char * winsockstr(int error)
在winsockstr()函数定义中,根据参数error的值返回不同的错误信息。
char * winsockstr(int error)
{
switch (error)
{
case WSAEINTR: return("INTR ");
case WSAEBADF: return("BADF ");
.....
}
}