기본적으로 큰 main() 함수로 구성된 일부 C 코드가 전달되었습니다. 나는 이제 메소드를 더 작은 함수로 전개하여 코드의 의도를 명확하게하려고 노력 중이다. 그래도 몇 가지 문제가 있어요 :절차 코드 리팩터링시 오류 처리
이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 주 문제를 식별 할 수 있습니다
- 는 인수의 수를 확인하는 것은 맞습니다.
- 명령 줄 인수에서 포트를 가져옵니다.
- 신호 호출 중 (SIGPIPE, SIG_IGN).
- 실제로 소켓과의 연결을 시도하십시오.
작은 함수로 리팩토링하려고 할 때의 문제는 주로 오류 처리와 관련이 있습니다.
int verify_number_of_args(int argc) {
if (argc != 3) {
printf("...");
return -1;
}
return 0;
}
를하고 실제로 그렇게 나쁜되지 않습니다
if (verify_number_of_args(argc) == -1) return;
같은 것입니다 전화 : 예를 들어, 다음과 같을 것 (1)의 논리를 추출하려고 r에. 이제, 소켓, 그 모두 sockfd
및 s_addr
가 반환 될 필요로하는 방법이 더 귀찮은 것, 플러스 상태 반환 값 : 가지로 내 주요 방법을 유지하기 위해 노력의 목적을 패배
int sockfd;
struct sockaddr_in* s_addr;
if (create_socket(port, &sockfd, s_addr) == -1)
return;
가능한 간단하고 명확합니다. 나는 물론 .c
파일의 전역 변수에 의존 할 수는 있지만 그렇게 좋은 아이디어는 아닙니다.
일반적으로 C에서 이런 종류의 작업을 어떻게 처리합니까?
"오류 처리"태그를 추가하고 제목을 편집했습니다. '[error-handling] [c]'에 대한 StackOverflow를 검색하십시오. –
@Catcall : 감사합니다! –