개발노예
133
2020-10-26 15:11:14
5
106

Python과 CPP간의 소켓통신에서 문자열 바이트를 넘기고 싶습니다


안녕하세요


간단한 Python과 CPP간의 소켓통신 샘플을 만들어보고 있습니다


Python에서 CPP로 패킷을 직접 만들어 보내보고있는데 int형 같은 숫자는 to_byte함수를 써서 보내지만 Python의 Str 타입은 어떻게 byte화 시켜서 보낼지 모르겠습니다


받는단에서 str 바이트의 크기를 알아야 패킷 파싱을 할 수 있는데...


혹시 관련 업무를 해보신 분들이 있으시다면 조언을 해주시면 감사드리겠습니다

0
  • 답변 5

  • 곰개발ㅈ ㅏ
    2020-10-26 15:45:29 작성 2020-10-26 15:46:00 수정됨

    보통 byte들의 순서를 디자인하고, 그 structure에 맞게 보낼것이고, byte ordering도 고려해야 되서, 지금 하시는 방법이 좀 고전적일 수 있습니다. 

    다른 언어간의 소통을 위해서는 protobuf를 추천합니다.

  • github.com/jaehyunup
    68
    2020-10-26 15:50:39

    받는단에서 받아야할 패킷의 크기가 매번 다르다면 첫번째 전송시 일정크기의 헤더를 보내고(헤더 내용은 받을 바이트 크기) 받는측에서 헤더를 먼저 해석하고 그만큼 받는 방식으로 해결하면 될것같습니다.

  • 개발노예
    133
    2020-10-26 17:37:47 작성 2020-10-26 17:38:44 수정됨

    곰개발ㅈ ㅏ 

    답변 감사드립니다

    패킷구조는 디자인 되어있고 byte order는 리눅스 환경 고려하여 little-endian으로 하는중입니다

    추천해주신 protobuf도 한번 고려해 보도록 하겠습니다 감사합니다


  • 개발노예
    133
    2020-10-26 17:39:42

    github.com/jaehyunup 

     57

    넵 말씀하신 방법대로 설계되어져 있습니다

    str 데이터 타입을 바이트로 변경하기위한 적절한 함수를 모르겠어서 문의드려 봤습니다

  • esrse
    995
    2020-10-26 21:05:46

    소켓 통신에 대해서 공부를 하시는 거라면 직접 쌩으로 만드셔 보시는 것도 도움이 될 겁니다.

    파이썬에서 문자열은 유니코드로 표현이 됩니다.

    그리고 그것을 serialize하려면 bytes로 만들면 되고, 그때 인코딩을 선택해야 합니다. 인코딩은 보통 utf-8을 쓰면 문제 없습니다.


    s = '안녕하세요'

    b = s.encode('utf-8')


    bytes의 길이는 len(b)로 재면 바이트 크기로 구해집니다.

  • 로그인을 하시면 답변 을 등록할 수 있습니다.