프로젝트 에서 부 딪 힌 오류 분석

프로젝트 소개: 서버 Linux, 클 라 이언 트 Windows, QQ 와 유사 한 기능 구현
일부 여전히 의혹
 1. 메시지 헤더 가 정의 되 었 습 니 다. 형식 은 다음 과 같 습 니 다.
//   
typedef struct MsgHead
{
    char cSenderName[16];
    char cRecverName[16];
    int iMsgType;
    int msglen;
    char * data() { return (char *)(this+1); }
}MsgHead, *pMsgHead;

메 시 지 를 받 았 을 때 메모 리 를 복사 할 때 data (), 즉 머리 뒤의 내용 을 복사 하 는 것 을 잊 었 다.
실천 은 char * 와 구조 체 간 의 전환 이 안전 하 다 는 것 을 증명 한다!
2. 한 스 레 드 에서 메 시 지 를 받 을 수 있 는 메모 리 를 정 의 했 습 니 다. recvBuf [1024] 라 고 가정 한 다음 에 처리 함수 handleMsg (const char * data, int dataLen) 를 호출 하여 처리 합 니 다.그러나 메모리 방출 오류 가 발생 했 습 니 다. 원인 분석: recvBuf 에서 const 를 사용 하여 한정 되 었 기 때문에 새로운 메시지 가 왔 을 때 handleMsg () 함수 가 이 메모 리 를 방출 하지 못 해 오류 가 발생 했 습 니 다.
3. 여러 스 레 드 가 같은 데이터 구 조 를 방문 하고 서로 배척 하 는 자 물 쇠 를 사용 할 때 자물쇠 가 나타 납 니 다.그러나 서로 자 물 쇠 를 배척 하지 않 을 때 스 레 드 A 는 특정한 요 소 를 삭 제 했 고 스 레 드 B 는 이 요소 에 접근 하려 고 했 습 니 다. 메모리 접근 이 잘못 되 어 메 인 스 레 드 가 자동 으로 종료 되 었 습 니까?틀린 힌트 하나 도 없어 요?의혹
4. 클 라 이언 트 를 작성 할 때 메모리 접근 오류 가 발생 할 수 있 습 니 다.그리고 코드 를 한 바퀴 둘 러 보 니 지침 같은 것 이 없 었 군요. 그리고 이 문 제 는 있 었 다 없 었 다 하 는 것 이 다 중 스 레 드 로 인 한 문제 인 것 같 습 니 다.아니 나 다 를 까 클 라 이언 트 는 받 은 데 이 터 를 캐 시 로 저장 하고 메시지 가 많이 들 어 오 면 처리 하지 못 하면 발생 합 니 다.Afx Message Box () 함수 로 디 버 깅 을 했 지만 정보 처리 가 중단 되 었 기 때문이다.Afx Message Box () 를 주석 한 후 문제 가 없습니다.
5. 클 라 이언 트 는 MFC 로 이 루어 졌 다.발송 자가 메 시 지 를 보 낸 후에 수신 자가 받 은 소식 은 모두 어 지 러 웠 다.중간 매개 변수 인 줄 알 았 을 때 문자 배열 과 포인터 복사 에 문제 가 있 었 습 니 다. 그리고 memcpy () 대신 strcpy () 를 사용 하면 '\ 0' 이전 ('\ 0' 포함) 의 유효 문자 만 복사 합 니 다.그러나 양쪽 을 왔 다 갔다 하 며 난 장 판 문제 가 있 었 다.
나중에 갑자기 생각 났 습 니 다. MFC 에서 CString 형식의 GetLength () 함 수 는 '\ \ 0' 이 포함 되 지 않 은 유효한 문자 만 가 져 온 것 같 습 니 다. 이렇게 전 달 될 때 까지 부적 을 찾 지 못 해 오류 가 발생 합 니 다!
CString. GetLength () + 1 이후 이 문 제 를 성공 적 으로 해결 했다.
6. 문자 배열 과 포인터 에 대하 여.문자 배열 을 사용 하기 전에 저 는 보통 메모리 설정 함수 memset () 로 안의 문 자 를 모두 0 으로 만 듭 니 다. 그러면 메모리 복사 할 때 종결 문자 가 있 을 것 이 고 비교적 안전 한 작업 에 속 합 니 다.그러나 문자 형식의 지침 은 다 릅 니 다. 보통 유효 문자 뒤에 종결 문자 '\ 0' 을 추가 하고 그 다음 에는 다른 내용 일 수 있 습 니 다.따라서 이 두 가 지 를 사용 할 때 가능 한 한 문자 형식의 함수, 예 를 들 어 strcmp (), strcpy () 등 을 사용 합 니 다.저 는 개인 적 으로 메모리 조작 함 수 를 선 호 하 는데 문제 가 생 길 수 있 습 니 다.
예 를 들 면  char * pName="china",char cName[16]={0}, memcpy(cName, "china", 16);
memcmp () 함수 로 비교 하면 결과 가 0 이 아 닌 경우 가 발생 합 니 다.strcmp () 함 수 를 사용 하여 비교 하면 결 과 는 0 이다.strcmp () 함수 가 유효한 문 자 를 비교 하기 때 문 입 니 다.
물건 을 쓸 때 배열 / 지침 을 자주 바 꾸 어 사용 하기 때문에 가끔 문제 가 생 길 수도 있다 (확인 해 야 한다).
7. 다 중 스 레 드 에 관 한 문제.
문제: 서버 쪽 에 서 는 클 라 이언 트 와 의 통신 마다 별도의 스 레 드 가 있 으 므 로 스 레 드 탱크 의 데 이 터 를 삭제 해 야 합 니 다.주 스 레 드 가 링크 가 올 때 스 레 드 탱크 의 데 이 터 를 추가 해 야 합 니 다.폴 링 스 레 드 는 계속 읽 으 려 면 스 레 드 탱크 의 데 이 터 를 삭제 해 야 합 니 다.
이렇게 하면 적어도 세 개의 스 레 드 가 스 레 드 탱크 에 접근 할 수 있 기 때문에 pthread 를 사용 해 야 합 니 다.mutex 로 잠 그 지만 상호 배척 자물쇠 만 사용 하면 잠 금 이 사라 집 니 다. 조건 변수 pthread 에 맞 춰 야 합 니 다.cond_t. 스 레 드 의 기다 림 과 깨 움 을 실현 하여 스 레 드 간 의 동기 화 를 실현 합 니 다.
8. 소켓 전송 String 의 질문
질문:
string 은 char * 에 해당 하 며, 네트워크 전송 지침 은 일반적으로 문제 가 있 습 니 다 (본 기계 의 스 레 드 통신 을 제외 하고).
C \ # 에 서 는 포인터 개념 이 없어 string 으로 전송 할 수 있 을 것 이 라 고 생각 했 지만 검증 할 때 오류 가 발생 했 습 니 다.
해결 방법:
내용 을 구조 체 에 넣 고 string 형식의 대상 을 구조 체 에 넣 지 마 세 요.모두 char [] 배열 로 저장 합 니 다.
C \ # 에서 배열 을 설명 할 때 배열 의 크기 를 지정 하지 않 고 new 키워드 로 분배 하기 때문에 구조 체 의 구조 함 수 를 다시 써 야 합 니 다.
코드 는 다음 과 같 습 니 다:
typedef struct _Info
{
	string name;
	string cipher;
	string signature;
}Info;

좋은 웹페이지 즐겨찾기