|
안녕하세요. herediy입니다.
똑같은 결과가 나오며, 가독성에 별 문제가 없다면
memset( sbuffer, 0x00, sizeof(sbuffer) );
strncpy(sbuffer, data+offset, poslen);
보단
if( poslen < sizeof(sbuffer) - 1 ) {
strncpy(sbuffer, data+offset, poslen);
sbuffer[poslen] = '\0';
else {
// 오류처리
}
식의 코드를 추천하고 싶습니다. 그 이유는 아래 코드의 처리 비용이 훨씬 적기 때문입니다.
좀더 상황을 나쁘게 만들기 위해 sbuffer를
char sbuffer[0x8000];
이라고 정의 했다면, 두 코드의 처리 속도 차이는 더 크게 벌어 졌을 겁니다(위 쪽 코드가 1번 처리할 때
아래 쪽 코드는 수 번 ~ 수 백번 처리 합니다). 특히 서버측 프로그램은 다수의 클라이언트가 접속되는
환경이므로 이러한 사항은 대단히 중요한 문제라 하겠습니다.
그리고 문자길이를 클라이언트 측에서 maxsize로 제한했기 때문에 서버에서 검사하지 않아도 된다고 하셨는데,
이것도 한 번 짚고 넘어가야 합니다. ^^;
클라이언트에서 검사했다고 해도 데이터가 통신회선을 타고 서버에 도착했을 때,
클라이언트에서 보낸대로 도착하지 않는 경우도 있기 때문 입니다.
데이터가 올바로 도착했는지 검증하기 위해 CRC등의 추가 자료를 보내는 경우가 대부분이지만
CRC로 100% 오류를 검출해 내는 것이 아니기 때문에 서버가 클라이언트의 데이터를
여과없이 실행하는 것은 안정성에서 큰 문제를 가져올 수 있습니다. 특히 누군가가 Packet를
조작했고 그것을 악용하려 했다면 문제는 더 심각해 지겠죠.
현 시점에서 효율적인 방법을 적용할지 조금 비 효율인 방식을 적용할지의 여부는
개발 상황에 따라 달라질 수 있지만, 적용전에 이에 대한 평가정도는
있어야 하지 않을까 해서 주저리 주저리 몇 자 남겼습니다.
행복하세요.
☆~ 님이 쓰신 글 :
: 답변 감사합니다.
: 그 문제가 구조체의 체워졌던 데이터를 memset로 0으로 다 채워준 후 strncpy로 문자열을 복사하니 잘 되더군요.
: 정확하게 왜 그렇게 차이가 나게 되는진 말 모르겠으나 일단 해결은 보았습니다.
:
: 아. 그리고 들어오는 문자길이는 클라이언트 측에서 이미 다 maxsize로 체한 걸어두었기 때문에 그렇게 예외 처리까진 않해도 되겠더군요;;
:
: 아무튼 답변 감사합니다.
|