时,有人递给我一些C代码,基本上是由一个大的main()函数的。我现在试图将该方法展开成更小的函数,以更清晰地表示代码的意图。我有一些麻烦,但:处理错误重构程序代码
void main(int argc, char *argv[])
{
if(argc != 3)
{
printf("Usage: table-server <port> <n_lists>\n");
return;
}
int port = atoi(argv[1]), n_lists = atoi(argv[2]);
if(port < 1024 || port > 49151 || n_lists < 1)
{
printf("Invalid args.\n");
return;
}
signal(SIGPIPE, SIG_IGN);
int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in s_addr;
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(port);
s_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd, (struct sockaddr *)&s_addr, sizeof(s_addr)) < 0)
{
printf("(bind).\n");
return;
}
if(listen(sockfd, SOMAXCONN) < 0)
{
printf("(listen).\n");
return;
}
我可以识别该代码的功能4个主要关注:
- 验证args来数是正确的。
- 从命令行获取端口参数。
- 调用信号(SIGPIPE,SIG_IGN)。
- 其实尝试与插座连接。
试图重构为小功能时,这个问题主要是与错误处理相关。例如,R试图提取1.逻辑是这样的:
int verify_number_of_args(int argc) {
if (argc != 3) {
printf("...");
return -1;
}
return 0;
}
,并呼吁它会是这样的
if (verify_number_of_args(argc) == -1) return;
。它实际上不是那么糟糕。现在,对于插座,那会是这样比较麻烦既是sockfd
和s_addr
需要返回,再加上状态返回值:
int sockfd;
struct sockaddr_in* s_addr;
if (create_socket(port, &sockfd, s_addr) == -1)
return;
哪一种失败的尝试让我的主要方法为目的尽可能简单明了。当然,我可以使用.c
文件中的全局变量,但这似乎不是一个好主意。
你怎么一般处理这种用C的东西?
我添加了一个“错误处理”标签并编辑了标题。在[错误处理] [c]'中搜索StackOverflow。 –
@Catcall:谢谢! –