C에서 사용자 정의형을 사용할때 이런 경우 어떻게 하시나요?
글쓴이: superkkt / 작성시간: 금, 2006/12/01 - 11:24오전
안녕하세요.
현재 개발중인 프로그램에서 프로토콜을 정의하는 구조체에 사용자 정의형을 몇가지 사용했습니다. 그중에 전송될 패킷의 길이에 사용되는 타입이 있습니다.
typedef struct { ... PacketLength length; /* Packet length except header */ ... } Packet;
패킷의 길이는 음수가 될 수 없기 때문에 처음에는 PacketLength를 unsigned int를 사용했습니다. 그리고 열심히 프로그램을 하다가 이제와서 문제를 하나 발견했는데요.. 아래와 같은 함수가 있습니다.
/** * recv_packet - 소켓에서 패킷 READ * * @parm idx: Host Index * @parm fd: 소켓 디스크립터 * @parm buf (out): 패킷 메모리 포인터 (호출자가 free해야 함) * return: 성공 시 읽어들인 패킷 사이즈, 실패시 -1 */ static PacketLength recv_packet(int idx, int fd, unsigned char **buf) { ...
이 함수가 성공하면 읽어들인 패킷 사이즈를 리턴하기 때문에 당연히 PacketLength 타입을 사용했습니다. 그런데 실패시 -1을 리턴하도록 되어있습니다. PacketLength는 unsigned int로 typedef 되어있고.. 확인해보니 이렇게 만든 함수가 한두개가 아니더군요.. ㅠ.ㅠ
한참을 고민하다가 결국엔 PacketLength를 signed int로 바꿨습니다. 현재는 signed int를 사용해도 별 문제가 없기에 그냥 이렇게 했지만 왠지 바보짓하고 있다는 생각이 드네요.
그렇다고 명시적으로 사용하기 위해 만든 타입을 안쓰고 다른 타입을 쓰게되면 추후 프토토콜 수정이 발생했을때 문제가 될테구요.
여러분은 이런 경우에 어떻게 하시나요? 좋은 방법이 있으면 조언 부탁드립니다.
Forums:
사이즈를 반환하는
사이즈를 반환하는 함수라면
실패시 0을 리턴해도 될텐데요.
참고로, 표준함수는
- ssize_t read(...)
Return Value
Upon successful completion, read() [XSI] and pread() shall return a non-negative integer indicating the number of bytes actually read. Otherwise, the functions shall return -1 and set errno to indicate the error.
- ssize_t recv(...)
Retrun Value
Upon successful completion, recv() shall return the length of the message in bytes. If no messages are available to be received and the peer has performed an orderly shutdown, recv() shall return 0. Otherwise, -1 shall be returned and errno set to indicate the error.
위의 함수는 read()의
위의 함수는 read()의 wrapping 함수라고 생각 할 수 있습니다. caller가 리턴값을 보고 connection pool에서 제거할지를 판단하기 때문에 end-of-file을 의미하는 0을 리턴하도록 할수는 없습니다.
======================
BLOG : http://superkkt.com
======================
BLOG : http://superkkt.com
저는 주로 signed int
저는 주로 signed int 사용해서...
현제까지 별문제가 없다면 PacketLength 타입을 signed int 로바꿀겁니다.
----------------------------------------------------------------------------
값의 범위 문제가 대두되지 않을까요?
값의 범위에 문제(상한값)가 없다면, 프로젝트 관련 분들과 논의해서 자료형을 변경하는 것이 좋을 것 같습니다.
하나의 패킷에
하나의 패킷에 포함되는 유저 데이터의 길이를 나타내는 값이기 때문에 signed int를 사용해도 무리가 없습니다. 일단 지금은 이러고 넘어가도 상관없지만 혹시나 더 좋은 방법이 있을까 싶어서요. ^^
======================
BLOG : http://superkkt.com
======================
BLOG : http://superkkt.com
댓글 달기