2020년 2월 17일 사용자 지정 프로토콜 학습

사용자 정의 프로토콜을 기입하십시오, 전송 및 모듈, SRC / msg.c은 다음과 수신 메시지를 캡슐화 :

사용법 #include "msg.h"
사용법 #include <unistd.h>
사용법 #include <string.h>
사용법 #include <memory.h>
사용법 #include <SYS / types.h>

// 계산 체크 코드计算校验码函数
정적 서명 숯불 msg_check (메시지 * 메시지)
{
    부호 문자 S = 0;
    I에서 INT;
    위한 (I = 0; I <를 sizeof (메시지 -> 헤드); I ++)
    {
        S + = 메시지 -> 헤드 [I]는;
    }
    에 대해 (나는 = 0; I <를 sizeof (메시지 -> 버프); I ++)
    {
        S + = 메시지 -> 버프 [I];
    }
    반환들;
}


//는 메시지 : 데이터를 상기 데이터 파라미터 버프 보내 버프
INT write_msg (INT sockfd와, 숯 * 버프, size_t와 LEN)
{
    메시지 메시지;
    memset 함수 (메시지, 0, sizeof의 (메시지))
    의 strcpy (메시지. 머리, "iotek2012");
    방어 적이기 (message.buff, BUFF, 렌),
    message.checknum msg_check = (메시지),
    IF (쓰기 (sockfd와, 메시지, sizeof의 (메시지))! = sizeof의 (메시지)) {
        반환 - . (1);
    }
    
}
// 메시지 나타날 데이터 sockfd와의 데이터 버프 버프 수신 메시지 파라미터를 판독
INT read_msg (INT sockfd와, 숯 * 버프, size_t와 LEN)
{
    메시지 메시지;
    memset 함수 (메시지, 0 상기는 sizeof (메시지))
    를 size_t 크기;
    ((크기 = 판독 (sockfd와, 메시지를 sizeof (메시지))) <0) {경우
        -1을 리턴;
    }
    다른 (크기 == 0) {경우
        0을 리턴;
    }

    코드 확인 //检查校验码是否正确
    서명 숯불 msg_check S = (메시지);
    (! (들 == (서명 숯불) message.checknum) && (을 strcmp ( "iotek2012", message.head는))) {// strcmp와 문자열에 대한 비교 기능의 경우
        방어 적이기는 (버프가 message.buff는, 렌);
        복귀를 sizeof (메시지);
    }
    리턴 -1;
}

특징이 size_t에 정의되는 부호 INT, 부호없는 정수 형태로 이해 <stddef.h>, <stdio.h>, <stdlib.h>, <string.h>, <time.h>和<wchar.h>코드의 이동성 증가, 표준 C 헤더 파일.

2. 컴파일 테스트

 컴파일 할 때 사용하는 명령 줄에서 -Iinclude 디렉토리에서 현재 디렉토리를 표시 헤더 파일의 검색 디렉토리 중 하나로 포함
 

发布了5 篇原创文章 · 获赞 3 · 访问量 372

추천

출처blog.csdn.net/Xinyue_Lu/article/details/104347825