【问题标题】:Send and receive an integer value over TCP in C在 C 中通过 TCP 发送和接收整数值
【发布时间】:2012-06-24 05:55:36
【问题描述】:

在一个程序中,我需要通过 TCP 套接字发送一个整数值。我为此目的使用了send()recv() 函数,但它们仅将其作为字符串发送和接收。

send()recv() 是否有任何替代方法来发送和接收整数值?

【问题讨论】:

  • send()recv() 处理字节。如何解释这些字节取决于您。
  • 什么语言?在此处分享您的代码 sn-p 以获得更准确的答案。
  • @Usman:通常要求提供代码 sn-p 是个好主意,但请注意问题上的 c 标签。大多数问题都以这种方式标记。
  • 嗯。我实际上建议将数字作为字符串发送,从而防止字节序之间的复杂性,如果开销不是太多的话。

标签: c sockets tcp network-programming


【解决方案1】:

send()recv() 不发送字符串。他们发送字节。由您来提供有意义的字节解释。

如果您希望发送整数,您需要确定要发送的整数大小——1 字节、2 字节、4 字节、8 字节等。您还需要确定encoding format"Network order" 描述了 Big-Endian 格式的约定。您可以使用<arpa/inet.h><netinet/in.h> 中的以下函数转换为网络订单和从网络订单转换:

   uint32_t htonl(uint32_t hostlong);
   uint16_t htons(uint16_t hostshort);
   uint32_t ntohl(uint32_t netlong);
   uint16_t ntohs(uint16_t netshort);

如果你坚持在发送前使用htonl() (host-to-network, long) 并在接收后使用ntohl() (network-to-host, long),你会没事的。

【讨论】:

    【解决方案2】:

    当然,您可以将整数作为四个字节发送(或者您的整数恰好是多少字节);但你必须小心。请参阅htonl() 函数,它可能在您的系统上显示在 <arpa/inet.h> 中。

    假设一个四字节整数 n,这可能会满足您的需求:

    uint32_t un = htonl(n);
    send(sockfd, &un, sizeof(uint32_t), flags);
    

    然后你可以在接收端编码补码。

    调用htonl() 的原因是,按照惯例,最高位字节首先通过 Internet 传输,而某些计算机体系结构(如无处不在的 x86)首先存储最低位字节。如果不固定字节序,而一端的机器是x86,另一端的机器是别的机器,那么没有htonl(),整数就会出现乱码。

    顺便说一句,我不是该主题的专家,但在没有专家答案的情况下,这个答案可能有用。祝你好运。

    【讨论】:

    • 在交叉编译和混合编译环境中按预期工作。
    【解决方案3】:

    我也试过了。但是写不出来。 所以我找到了另一个解决方案。

    // send
    char integer[4];                  // buffer
    *((int*)integer) = 73232;         // 73232 is data which I want to send.
    send( cs, integer, 4, 0 );        // send it
    
    // receive
    char integer[4];                  // buffer
    recv( s, integer, 4, 0 );         // receive it
    

    【讨论】:

    • 当我现在尝试时它对我有用。我想知道为什么我们没有为第二个参数添加和号前缀。有什么想法吗?
    • 如何在接收端打印整数?它必须与 73232 相同
    猜你喜欢
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多