다음은 빠른 배경입니다. 유닉스 소켓을 통해 서로 통신하는 클라이언트와 서버 프로그램이 있습니다. 서버 쪽에서받은 메시지를 구문 분석 할 때 strncmp를 사용하여 수행 할 작업을 파악하려고합니다.strncmp 적절한 사용
내가 겪고있는 문제는 strncmp의 길이 인수에 정확히 무엇을 사용해야하는지 파악하는 것입니다. 이것이 문제가되는 이유는 내 메시지 중 일부가 공통 접두사를 공유하기 때문입니다. 예를 들어, 서버가 주 서버 주소로 응답하도록하는 "getPrimary"메시지와 서버가 주 서버의 상태로 응답하게하는 "getPrimaryStatus"메시지가 있습니다. 나는 서버 "getPrimaryStatus"strncmp 충분히 멀리 문자열에서 확인되지 않기 때문에, 코드가 항상 foo는 반환을 보낼 때
if(strncmp(message,"getPrimary",strlen("getPrimary"))==0){
return foo;
}
else if(strncmp(message,"getPrimaryStatus",strlen("getPrimaryStatus"))==0){
return bar;
}
이 가진 문제는 나의 초기 생각은 다음을 수행하는 것이 었습니다. strncmp의 길이 인수로 strlen (메시지)을 전달할 수 있지만 예상치 못한 입력이 발생할 경우 오버플로를 방지하기 위해 strncmp를 사용하는 목적을 무력화시키는 것 같습니다. 나는 읽을 수있는 최대 메시지 길이에 대한 정적 변수를 가지고 있지만, 메시지 오버플로가 발생하면 효과가 최소화되도록 길이를 지정하는 것과 같이 전달하는 것처럼 보입니다.
나는 몇 가지 해결책을 생각해 냈지만 그다지 예쁘지 않아이 문제를 다루는 일반적인 방법이 있는지 궁금해하고있었습니다. 참고로
, 내 현재의 솔루션은 다음과 같습니다 주문 내 경우/다른 경우 일반적인 접두사 어떤 메시지가 지뢰를 던질 수있는 정말 좋은 방법처럼 보인다 하강 길이의 순서 (체크되어있는 방식 문 나중에 뭔가를 추가하려는 누군가를위한 코드).
그룹 내 공통 접두어와 메시지를 함께 먼저 접미사을 찾습니다
if(strncmp(message,"getPrimary",strlen("getPrimary"))==0){
if(strncmp(message,"getPrimaryStatus",strlen("getPrimaryStatus"))==0){
return bar;
else
return foo;
}
}
을하지만 이것은 단지 내가 처리하고있어 약 20 개의 가능한 메시지가 특히 이후, 지저분한 느낌.
가능한 모든 메시지의 배열을 만들고 길이를 내림차순으로 정렬 할 함수를 내 init 시퀀스에 추가하고 일치하는 항목을 찾을 때까지 해당 코드의 요소를 검색합니다. 이것은 복잡하고 어리석은 것처럼 보입니다.
어딘가에 해결책이 있어야하는 공통된 문제 여야합니다.하지만 지금까지 아무 것도 찾을 수 없었습니다.
미리 도움을 청하십시오!
가장 간단한 해결책 인 것 같습니다. 이것은 실제로 프로세스 간 통신을 용이하게하기 위해 유닉스 소켓을 사용하여 처음으로, 그리고 두 달 전 소켓 처리 코드를 썼다 ... 나는 읽은 바이트 수를 반환하는 read()를 사용하고 있다는 것을 완전히 잊었다! –
대신 strncmp에 메시지 크기를 전달하는 것이 문제에 대한 불완전한 해결책이라고 생각합니다. 자세한 내용은 내 솔루션을 참조하십시오. –
일치하는 문자가 많은 문자열 간의 비교는 "청킹"방식을 사용하면 가장 효율적으로 수행 할 수 있지만 초기에 다른 문자열 간의 비교는 한 번에 한 문자 씩 접근하여보다 효율적일 수 있습니다. "n"이 클 때 strncmp의 일부 구현이 청크를 사용하는 경우 놀라지 않을 것입니다. 그러나 일치 가능성이있는 유스 케이스와 가능성이 적은 유스 케이스에 별도의 기능이 있다면 좋을 것입니다. – supercat