홈>
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
관련 자료
- java : 이름의 문자열 목록에서 2 차 알파벳 정렬을 사용하는 방법은 무엇입니까?
- python - smote - 문자열을 부동으로 변환 할 수 없습니다
- java - 입력에서 가져온 문자열을 어떻게 암호화 할 수 있습니까?
- python - 부분 문자열 뒤의 문자열에서 날짜를 결정할 수있는 정규식 코드를 작성하는 방법
- python - valueerror - 문자열을 float로 변환 할 수 없습니다 : 'erght'
- flutter - 오류 유형 '문자열'이 '인덱스'의 'int'유형의 하위 유형이 아닌 오류 유형에 대한 해결책은 무엇입니까?
- python 3.x - 문자열에서 사용자 이름 필터링
- python - 문자열을 부동 소수점으로 변환 할 수 없음 - '2648142'(panda)
- python - 문자열을 부동 소수점으로 변환 할 수 없습니다 - '1000000 %'
- r - 문자열에 언급 된 모든 국가 이름을 식별하고 그에 따라 분할하는 방법은 무엇입니까?
- java - 이 문자열을 2 자 단위로 분리하려면 어떻게해야합니까?
- python - 색인으로 문자열을 제거하려면 어떻게해야합니까?
- unity3d - PlayerPrefs가 문자열을 저장하지 못하는 원인은 무엇입니까?
- numpy ndarray - python valueerror - 문자열을 부동 소수점으로 변환 할 수 없습니다
- javascript - JSONstringify (JSONparse (foo))가 유효한 JSON 문자열을 변경할 수 있습니까?
- 오류 : 다음 패키지 이름을 해결할 수 없습니다. Julia에 패키지 설치 오류
관련 질문
- C의 TCP/IP 소켓 -소켓을 통해 포인터 유형 필드가 있는 구조 보내기
- 이더넷, IP 및 TCP 헤더 구문 분석
- TUN 인터페이스를 생성하는 내 code를 실행하고 내 code에서 TCP 수신 포트를 시뮬레이션합니다. 따라서 수신된 SYN 패킷은 code에서 SYN+ACK로 응답했습니다.
- do TCP 경고는 패킷이 무시되었음을 의미합니다. "Wireshark(Warning/Malformed):Short segment.Segment/fragment는 전체 TCP 헤더를 포함하지 않습니다(NMAP일 수 있음)"
- TCP 시퀀스 및 승인 번호 | TCP 핸드셰이크 중에 이 숫자가 중요합니까?
- 기본 Linux TCP/IP 스택을 사용하여 TCP send/recv에 제로 복사를 사용할 수 있습니까?
이 루프 :
몇 가지 문제가 있습니다.
1) 게시 된 코드 전체에 일반적으로 들여 쓰기가 일관성이 없습니다. 일관성을 유지하기 위해 모든 열기 괄호 '{'뒤에 들여 쓰기하십시오. 닫는 중괄호 '}'앞에 들여 쓰기를하지 않습니다. 각 들여 쓰기 수준을 4 칸으로 제안하십시오.
2) 디렉토리 엔트리에는 많은 종류의 엔트리가 있습니다. (링크, 하위 디렉토리 등)
결과 문자열에 특정 '파일 이름'을 포함시키기 전에. 코드는 항목 유형을 점검하여 파일이 정상 파일이고 파일 이름이
.
가 아닌지 확인해야합니다. 또는..
==== 변수 :
len
초기화되지 않았습니다 :==== 함수
strlen()
문자열 끝에서 NUL 바이트로 오프셋을 반환하고 오프셋은 1이 아닌 0에서 시작하므로 실제 길이는 1 바이트 더 깁니다==== 질문은 말하지 않습니다 :이 코드는 현재 디렉토리 파일 이름 만 수집합니까 아니면 하위 디렉토리에 파일 이름을 포함합니까?
==== 질문은 상태가 아닙니다 : 파일 이름이 함께 걸리거나 공백이나 쉼표로 구분되어 있습니까? 공백으로 구분 된 경우 공백이 포함 된 파일 이름은 어떻습니까?
==== BTW : 기능 이름 :
writen()
그리고readn()
에서 왔습니까?