代码之家  ›  专栏  ›  技术社区  ›  Vivek Sharma

我应该对网络上的命令使用#defines还是枚举?

  •  0
  • Vivek Sharma  · 技术社区  · 17 年前

    我必须通过网络传输一些值作为命令使用,我希望它尽可能高效和稳健,即我需要

    命令的范围不应超过20个命令(假设每个定义的命令响应为40个),因此根据我所听到的大多数情况,它非常适合char限制。

    4 回复  |  直到 17 年前
        1
  •  4
  •   IRBMe    17 年前


    ntohs(网络到主机,简称)

    htons(主机到网络,简称)

    长版本使用32位整数,短版本使用16位整数。只要您在通过网络传输数据之前始终调用*hton**,并在从网络读取数据时调用*ntoh**,数据将按正确的字节顺序排列。

    你必须处理的第二个问题是编码。有符号整数是如何表示的?使用符号位?二者互补?同样,当网络上的不同平台使用不同的表示时,您会遇到问题。如果你坚持使用无符号类型,你应该不会有问题。

    你在程序中使用什么来表示你的命令完全取决于你。只要确保你很好地定义了你的协议,并在传输和读取数据时遵守它。

    enum command_t { one, two, three }
    
    void send_command(command_t c) {
        send((unsigned char)c);
    }
    
    command_t read_command() {
        return (command_t)recv();
    }
    
    void send(unsigned char c) { ... }
    unsigned char recv() { ... }
    
        2
  •  1
  •   Chris Arguin    17 年前

    从效率的角度来看,这没有任何区别。#define或enum只是一种赋值方式。..真正的诀窍是如何将价值打包到网络上。

        3
  •  1
  •   Tom    17 年前

    enum -vs。 #define

    $ telnet www.yahoo.com 80
    Trying 69.147.76.15...
    Connected to www-real.wa1.b.yahoo.com.
    Escape character is '^]'.
    GOAT / HTTP/1.1
    

    HTTP/1.1 400 Bad Request
    Date: Sat, 11 Jul 2009 16:20:59 GMT
    Cache-Control: private
    Connection: close
    Transfer-Encoding: chunked
    Content-Type: text/html; charset=iso-8859-1
    

    太棒了 telnet nc

    共享

    如果你想在一个项目上与其他人合作,能够将网络操作描述为纯文本是很好的。如果其他人想开发自己的客户端,他们不需要使用你的头文件或任何东西,他们只需要遵守类似RFC的标准。这对宠物项目没有用,但对于任何可能变得更大的项目来说,考虑这是一件好事。

        4
  •  0
  •   C. K. Young    17 年前

    很多现实生活中的协议都是基于文本的,我敢说它们的工作效率很高。例如,HTTP、FTP、SMTP等都是基于文字的。