来自 C++ 客户端的 Java DataInputStream readInt() 获得了巨大的值(value)

标签 java c++ sockets networking

我怀疑这与字节顺序有关,但我不确定如何解决它。我有一个 C++ 客户端告诉 Java 服务器它要发送多少字节,而 Java 服务器只是在输入流上调用 readInt()。然后服务器继续读取其余数据。

此刻如果C++服务器调用:

char l = '3';
BytesSent = send( Socket, &l, 1, 0 );

那么对应的Java端就是:

int lBytesSent = m_InDataStream.readInt();

m_AckNack = new byte[lBytesSent];
m_InDataStream.read(m_AckNack)

字节 lBytesSent 往往是一些巨大的值,然后在创建数组时抛出异常(不足为奇)

C++ 套接字可以简单地打开:

Socket = socket(AF_INET, SOCK_STREAM, 0);
Option = 1000;
setsockopt(Socket, SOL_SOCKET, SO_RCVTIMEO, (char *) &Option, sizeof(Option));
server.sin_family = AF_INET;
server.sin_port = htons(Port);
server.sin_addr.s_addr = INADDR_ANY;
memset(&(server.sin_zero), '\0', 8);
connect(Socket, (sockaddr*)&server, sizeof(server));

Java 方面:

ServerSocket listener = new ServerSocket(port);
Socket server;
server = listener.accept();

为清楚起见,删除了错误检查。

任何建议都很好

非常感谢

标记

最佳答案

尝试通过 htonl 运行数字在发送之前(在 C++ 端):

long x = htonl(42); /* x now contains 42 represented in network byte order */

关于来自 C++ 客户端的 Java DataInputStream readInt() 获得了巨大的值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9385542/

相关文章:

java - 如何将具有给定索引的新元素添加到链表中?

java - android 在 vi​​ewholder 中设置了 widget 的大小,但是内容不显示?

java - JOptionPane showInputDialog null?

无法从另一台计算机访问 Windows 7 上的 Python 套接字

java - 对于少量 (16 < x < 24) 的同时客户端连接尝试,Windows 主机上的服务器拒绝客户端套接字连接

java - 尝试将 UUID 属性(外键)转换为实体对象时出现异常

c++ - 如何将结构放入 union 中

c++ - Linux下如何创建和监控子进程?

c++ - C/C++ h264或ON VP6开源视频编码器

java - WARN/ActivityManager(78) : Launch timeout has expired, 放弃唤醒锁! -> 这是什么