c에서 클라이언트의 서버로 줄 단위로 파일을 보내려면 c로 프로그램을 작성했습니다. 파일이 완전히 전송 된 후 파일이 끝났고 다음 파일이 다음에 전송되고 있음을 확인하기 위해 서버에서 문자열 비교를 위해 txt 파일에 endoffile
줄을 제공했습니다. 다음 파일은 서버의 다른 파일에 기록되어야합니다. 하지만 문제는 strcmp가 코드에서 endoffile
을 결코 감지하지 못하기 때문에 클라이언트의 파일에서 동일한 문자열로 endoffile
이 수신되었다는 것입니다. amd는 클라이언트의 다음 파일을 서버의 동일한 파일에 계속 작성합니다.TCP를 통한 전송에서 문자열 비교 오류가 발생했습니다.
char enof[]="endoffile";
...
do
{
rewind(appcrt);
bytes_recieved = recv(pass_arg.connected, recv_data_c, strlen(recv_data_c), 0);
recv_data_c[bytes_recieved-1] = '\0';
fputs(recv_data_c, appcrt);
if(strcmp(enof,recv_data_c) == 0){break;}
}while(check<count);
텍스트 파일 :
Necessary data
that is
being transmitted
to be written to the file
endoffile
txt 파일에서 읽고 서버로 전송하기 위해 사용되는 코드 : 내가 지금 상태에서 확인해야하는 내용을 변경
while (fgets(line, sizeof(line), crt) != NULL)
{
send(sock, line, sizeof(line), 0);
}
문제가 해결되고 코드가 do....while();
루프에서 종료됩니다. 미리 감사드립니다. 운영 플랫폼 : 리눅스
EDIT1는 다음과 같이 do....while()
을 편집 :
do
{
rewind(appcrt);
bytes_recieved = recv(pass_arg.connected, recv_data_c, 100, 0);
recv_data_c[bytes_recieved] = '\0';
fputs(recv_data_c, appcrt);
printf("%s-%s",enof,recv_data_c);
//if(strcmp(enof,recv_data_c) == 0){break;}
}while(check<count);
터미널에서 다음과 같은 결과를 얻었다 : 아직도
endoffile-file1line1
endoffile-file1line2
endoffile-file1line3
endoffile-file1line4
endoffile-file1line5
endoffile-file1line6
endoffile-endoffile
endoffile-file2line1
endoffile-file2line2
endoffile-file2line3
endoffile-file2line4
endoffile-file2line5
endoffile-file2line6
.
.
.
희망도.
'strlen (recv_data_c)'는 매우 의심 스럽습니다. 문자열이 처음에는 비어 있으면 아무것도 수신하지 않습니다. 그 위에, 반환 값이 0 또는 음수이고 인덱스 -1에서 배열에 액세스하거나 그보다 더 나쁜 경우는 어떻게됩니까? 나는 당신이 그것들을 고치고 print statement를 추가하여 처음에 그것이 무엇을 받는지보기를 권한다. –
'recv_data_c'가 문자의 배열이라고 가정하면'recv' 호출에서'strlen (recv_data_c)'대신'sizeof (recv_data_c) -1'을 전달해보십시오. –
@VladLazarenko : 그뿐만 아니라, NUL 바이트가 잘못된 시간에 전송되면 해킹에 큰 위험이 될 수 있습니다. – Linuxios