面试题答案
一键面试设计思路
- 统一错误码定义:在项目中定义一套独立于系统的错误码体系,将常见的网络编程错误映射到自定义错误码。这样不同平台下都基于这套统一的错误码进行处理,避免因系统错误码差异带来的问题。
- 错误信息获取函数封装:封装获取错误信息的函数,在函数内部根据不同平台调用相应的系统函数来获取错误信息,并将其转化为统一格式。
- 日志记录:将错误信息记录到日志文件中,方便调试和排查问题。日志记录应包含时间、错误码、错误信息以及发生错误的代码位置等关键信息。
- 模块化设计:将错误处理相关代码封装成独立模块,提高代码的可维护性和扩展性。其他模块通过调用该模块的接口来处理错误。
关键代码片段
- 自定义错误码定义
// 自定义错误码定义
typedef enum {
ERR_SUCCESS = 0,
ERR_SOCKET_CREATE = -1,
ERR_SOCKET_BIND = -2,
ERR_SOCKET_LISTEN = -3,
// 其他网络相关错误码...
} ErrorCode;
- 错误信息获取函数封装
#include <stdio.h>
#include <string.h>
#include <errno.h>
#ifdef _WIN32
#include <windows.h>
#include <winerror.h>
#endif
const char* get_error_message(ErrorCode errCode) {
static char errorMessage[256];
switch (errCode) {
case ERR_SUCCESS:
return "Success";
case ERR_SOCKET_CREATE:
return "Socket creation failed";
case ERR_SOCKET_BIND:
return "Socket bind failed";
case ERR_SOCKET_LISTEN:
return "Socket listen failed";
// 其他错误码处理...
default:
#ifdef _WIN32
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, errCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
errorMessage, sizeof(errorMessage), NULL);
return errorMessage;
#else
return strerror(-errCode);
#endif
}
}
- 错误处理与日志记录示例
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/socket.h>
#include <arpa/inet.h>
void log_error(ErrorCode errCode, const char* location) {
time_t now;
struct tm *tm_info;
time(&now);
tm_info = localtime(&now);
char timeStr[26];
strftime(timeStr, 26, "%Y-%m-%d %H:%M:%S", tm_info);
const char* errorMessage = get_error_message(errCode);
FILE* logFile = fopen("network_app.log", "a");
if (logFile) {
fprintf(logFile, "[%s] Error %d at %s: %s\n", timeStr, errCode, location, errorMessage);
fclose(logFile);
}
}
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
log_error(ERR_SOCKET_CREATE, "main - socket creation");
return EXIT_FAILURE;
}
// 后续网络编程代码...
return EXIT_SUCCESS;
}
在网络编程的关键函数调用后,如socket
、bind
、listen
等,根据返回值判断是否发生错误。若发生错误,将对应的自定义错误码传递给log_error
函数进行错误记录和处理。这样在不同平台下都能以统一的方式处理网络编程错误,提高了程序的跨平台兼容性、可维护性和扩展性。