>

dirent 구조체에서 파일 이름을 가져 와서 모든 이름 목록을 연결된 문자열로 클라이언트에 보냅니다.

몇 시간 동안 알아 내려고 시도한 후 메모리를 올바르게 할당하거나 올바르게 읽을 수없는 것처럼 보이지만 문자열이 다시 반환되므로 메모리를 잘못 읽은 것 같습니다. '\ 0'으로 문자열을 추가했습니다

여기까지 내가 한 일이 있습니다.

문자열을 클라이언트에게 보내기 :

void send_file_list(int socketNumber)
{
    DIR *mydir;
    if ((mydir = opendir("upload")) == NULL) {
    perror("error");
    exit(EXIT_FAILURE);
    }
    struct dirent *entry = NULL;
    size_t len;
    //loop through entry to get size of all filenames as string.
    while ((entry = readdir(mydir)) != NULL)
    {
    len = len + strlen(entry->d_name);
    }
    char filelist[len];
    //returns NULL when dir contents all processed
    while ((entry = readdir(mydir)) != NULL)
    {
    strcat(strcat(filelist, entry->d_name),"\n");
    }
    closedir(mydir);
    size_t n = len;
    writen(socketNumber, (unsigned char *) &n, sizeof(size_t)); 
    writen(socketNumber, (unsigned char *) filelist, n);
    printf("Sent file list of size %zu bytes\n",n);
}//end send_file_list()

서버에서 문자열 가져 오기 :

void get_file_list(int socket)
{
    size_t k;
    readn(socket, (unsigned char *) &k, sizeof(size_t));
    char filelist[k];   
    readn(socket, (unsigned char *) filelist, k);
    printf("Received: %zu bytes\n\n", k);
    printf("\n---Files On Server -------------------\n");
    printf("%s", filelist);
    printf("\n--------------------------------------\n"); 
} // end get_file_list()

witen ()과 readn ()은 가져온 파일 rdwrn.c와 .h에서 가져온 것입니다. 이것은 코스워크 프로젝트의 일부였습니다. 어떻게 작동하는지 잘 모르겠지만 기본적으로 주어진 소켓에서 읽고 씁니다. . 나는 그들을 만들지 않았다.

몇 시간 동안 사용했는데 지저분 해지고 있습니다. 더 좋은 방법이 있습니까?

  • 답변 # 1

    이 루프 :

    while ((entry = readdir(mydir)) != NULL)
    {
    len = len + strlen(entry->d_name);
    }
    
    

    몇 가지 문제가 있습니다.

    1) 게시 된 코드 전체에 일반적으로 들여 쓰기가 일관성이 없습니다. 일관성을 유지하기 위해 모든 열기 괄호 '{'뒤에 들여 쓰기하십시오. 닫는 중괄호 '}'앞에 들여 쓰기를하지 않습니다. 각 들여 쓰기 수준을 4 칸으로 제안하십시오.

    2) 디렉토리 엔트리에는 많은 종류의 엔트리가 있습니다. (링크, 하위 디렉토리 등)

    결과 문자열에 특정 '파일 이름'을 포함시키기 전에. 코드는 항목 유형을 점검하여 파일이 정상 파일이고 파일 이름이 . 가 아닌지 확인해야합니다.  또는 ..

    ==== 변수 : len  초기화되지 않았습니다 :

    size_t len = 0;
    
    

    ==== 함수 strlen()  문자열 끝에서 NUL 바이트로 오프셋을 반환하고 오프셋은 1이 아닌 0에서 시작하므로 실제 길이는 1 바이트 더 깁니다

    ==== 질문은 말하지 않습니다 :이 코드는 현재 디렉토리 파일 이름 만 수집합니까 아니면 하위 디렉토리에 파일 이름을 포함합니까?

    ==== 질문은 상태가 아닙니다 : 파일 이름이 함께 걸리거나 공백이나 쉼표로 구분되어 있습니까? 공백으로 구분 된 경우 공백이 포함 된 파일 이름은 어떻습니까?

    ==== BTW : 기능 이름 : writen()  그리고 readn()  에서 왔습니까?

관련 자료

  • 이전 javascript - 키와 값으로 배열 필터링
  • 다음 구글 맵 자바 스크립트에서 특정 영역의 스냅 샷 찍기