C에서 사용자 정의형을 사용할때 이런 경우 어떻게 하시나요?

superkkt의 이미지

안녕하세요.

현재 개발중인 프로그램에서 프로토콜을 정의하는 구조체에 사용자 정의형을 몇가지 사용했습니다. 그중에 전송될 패킷의 길이에 사용되는 타입이 있습니다.

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를 사용해도 별 문제가 없기에 그냥 이렇게 했지만 왠지 바보짓하고 있다는 생각이 드네요.

그렇다고 명시적으로 사용하기 위해 만든 타입을 안쓰고 다른 타입을 쓰게되면 추후 프토토콜 수정이 발생했을때 문제가 될테구요.

여러분은 이런 경우에 어떻게 하시나요? 좋은 방법이 있으면 조언 부탁드립니다.

익명사용자의 이미지

사이즈를 반환하는 함수라면
실패시 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.

superkkt의 이미지

위의 함수는 read()의 wrapping 함수라고 생각 할 수 있습니다. caller가 리턴값을 보고 connection pool에서 제거할지를 판단하기 때문에 end-of-file을 의미하는 0을 리턴하도록 할수는 없습니다.

======================
BLOG : http://superkkt.com

======================
BLOG : http://superkkt.com

ㅡ,.ㅡ;;의 이미지

저는 주로 signed int 사용해서...

현제까지 별문제가 없다면 PacketLength 타입을 signed int 로바꿀겁니다.


----------------------------------------------------------------------------

lovewar의 이미지

값의 범위에 문제(상한값)가 없다면, 프로젝트 관련 분들과 논의해서 자료형을 변경하는 것이 좋을 것 같습니다.

superkkt의 이미지

하나의 패킷에 포함되는 유저 데이터의 길이를 나타내는 값이기 때문에 signed int를 사용해도 무리가 없습니다. 일단 지금은 이러고 넘어가도 상관없지만 혹시나 더 좋은 방법이 있을까 싶어서요. ^^

======================
BLOG : http://superkkt.com

======================
BLOG : http://superkkt.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.