通过套接字从 Java 客户端写入 int 到 c 服务器
write int from Java client to c server over socket
我认为这可能是字节顺序,但它看起来不像。
我不确定它还能是什么。
Java linux
客户端
private static final int CODE = 0;
Socket socket = new Socket("10.10.10.10", 50505);
DataOutputStream output = new DataOutputStream(socket.getOutputStream());
output.writeInt(CODE);
c 服务器也在 linux
int sd = createSocket();
int code = -1;
int bytesRead = 0;
int result;
while (bytesRead < sizeof(int))
{
result = read(sd, &code + bytesRead, sizeof(int) - bytesRead);
bytesRead += result;
}
int ntolCode = ntohl(code); //test for byte order issue
printf("\n%i\n%i\n%i\n", code, ntolCode, bytesRead);
打印出:
-256
16777215
4
不确定还能尝试什么。
解决方案
这个解决方案至少对我来说并不直观,但无论如何感谢您的反对票!
Java边
Socket socket = new Socket("10.10.10.10", 50505);
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
int x = 123456;
ByteBuffer buff = ByteBuffer.allocate(4);
byte[] b = buff.order(ByteOrder.LITTLE_ENDIAN).putInt(x).array();
out.write(b);
C面
int sd = createSocket();
char buff[4];
int bytesRead = 0;
int result;
while (bytesRead < 4){
result = read(sd, buff + bytesRead, sizeof(buff) - bytesRead);
if (result < 1) {
return -1;
}
bytesRead += result;
}
int answer = (buff[3] << 24 | buff[2] << 16 | buff[1] << 8 | buff[0]);
如果有人有任何解决方案,我仍然对更简单的解决方案感兴趣,如果可能的话,最好使用 BufferedWriter。
问题出在这里:
&code + bytesRead
这将以 4 (sizeof code
) 的步长递增 code
的地址,而不是 1。您需要一个字节数组或一些类型转换。
你忘了设计和实现协议!您编写了一段代码以一种格式发送数据,另一段代码以完全不同的格式接收数据。确定一种格式,记录该格式,然后编写以该格式发送的代码,然后编写以该格式接收的代码。
不要跳过文档步骤。这是最重要的。准确记录将使用哪些字节来传达信息。
我认为这可能是字节顺序,但它看起来不像。 我不确定它还能是什么。
Java linux
客户端private static final int CODE = 0;
Socket socket = new Socket("10.10.10.10", 50505);
DataOutputStream output = new DataOutputStream(socket.getOutputStream());
output.writeInt(CODE);
c 服务器也在 linux
int sd = createSocket();
int code = -1;
int bytesRead = 0;
int result;
while (bytesRead < sizeof(int))
{
result = read(sd, &code + bytesRead, sizeof(int) - bytesRead);
bytesRead += result;
}
int ntolCode = ntohl(code); //test for byte order issue
printf("\n%i\n%i\n%i\n", code, ntolCode, bytesRead);
打印出:
-256
16777215
4
不确定还能尝试什么。
解决方案
这个解决方案至少对我来说并不直观,但无论如何感谢您的反对票!
Java边
Socket socket = new Socket("10.10.10.10", 50505);
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
int x = 123456;
ByteBuffer buff = ByteBuffer.allocate(4);
byte[] b = buff.order(ByteOrder.LITTLE_ENDIAN).putInt(x).array();
out.write(b);
C面
int sd = createSocket();
char buff[4];
int bytesRead = 0;
int result;
while (bytesRead < 4){
result = read(sd, buff + bytesRead, sizeof(buff) - bytesRead);
if (result < 1) {
return -1;
}
bytesRead += result;
}
int answer = (buff[3] << 24 | buff[2] << 16 | buff[1] << 8 | buff[0]);
如果有人有任何解决方案,我仍然对更简单的解决方案感兴趣,如果可能的话,最好使用 BufferedWriter。
问题出在这里:
&code + bytesRead
这将以 4 (sizeof code
) 的步长递增 code
的地址,而不是 1。您需要一个字节数组或一些类型转换。
你忘了设计和实现协议!您编写了一段代码以一种格式发送数据,另一段代码以完全不同的格式接收数据。确定一种格式,记录该格式,然后编写以该格式发送的代码,然后编写以该格式接收的代码。
不要跳过文档步骤。这是最重要的。准确记录将使用哪些字节来传达信息。