【问题标题】:Java's readInt() equivalent in C?Java 在 C 中的 readInt() 等价物?
【发布时间】:2011-04-25 11:05:11
【问题描述】:

一方面,我有一个 Java 客户端将整数写入其输出流:

int a = 20;
dataout.writeInt(a);
dataout.flush();

另一方面,我有一个 C 服务器正在监听连接:

int client = accept(...);

如何读取Java发送的int?

如果我有 Java 服务器,我可以轻松编写:

int a = dataIn.readInt();

如何在 C 中做到这一点?

谢谢

【问题讨论】:

  • 将取决于服务器的字节序。

标签: java c linux sockets inputstream


【解决方案1】:

将其读入char缓冲区并使用atoi()将字符串转换为int。

【讨论】:

  • 假设一个整数为 4 个字节,这是你的意思吗?字符缓冲区 [4];读取(客户端,buf,4); int 整数 = atoi(buf);
  • 不完全——如果 Java 服务器将 Int 作为四个字节发送,整个事情会变得更加复杂,因为您基本上需要确切地知道 Int 是以什么字节顺序发送的。我会尝试将 Int 作为字符串发送,使用更大的缓冲区(最多 16 个字节)来存储字符串,然后按照您的建议使用 atoi。如果您将 Int 作为字节表示形式发送,我会在发送之前将其转换为网络字节顺序,并在您收到后将其转换回主机顺序,否则您将处于一个非常奇怪的错误世界中。
  • atoi 没有错误处理,atoi("0") == atoi("blah");最好使用 strtol
【解决方案2】:

你可以使用 read 函数,但你必须小心从套接字中消耗 sizeof(int) 字符,然后你必须担心字节序。

【讨论】:

    【解决方案3】:

    如果您不介意以纯文本形式发送,fscanf 应该可以工作:

    fscanf(dataIn, "%d", &a);
    

    纯文本规则 :-) 只需确保在刷新之前从源发送一个“\n”(或非数字)。

    【讨论】:

      猜你喜欢
      • 2020-07-17
      • 2018-05-17
      • 2014-08-29
      • 2011-07-21
      • 1970-01-01
      • 2010-11-19
      • 2010-10-24
      • 1970-01-01
      • 2014-11-22
      相关资源
      最近更新 更多