0

我想向服务器发送一个整数,增加它并将新数字和一个随机字符串发送回 Client 。我使用此代码

int value = htons( 4 );
int reply = 0;
send( to_server_socket, &value, sizeof( value ),0 );
recv( to_server_socket, &reply, sizeof( reply ), 0 );
printf( "got reply: %d\n", ntohs( reply ) );

服务器代码

DataInputStream din = new DataInputStream(socket.getInputStream());
        int ClientNumber= din.readInt();
        System.out.println(ClientNumber);


        ClientNumber++;
       DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
       dos.writeInt(ClientNumber);

       String randomString= getRandomValue(10,20);
       dos.writeUTF(randomString);

但服务器没有收到 4 但 262144 和客户端中的回复仍然为 0。我在服务器中也有错误

java.io.EOFException 在 java.io.DataInputStream.readUnsignedShort(DataInputStream.java:323) 在 java.io.DataInputStream.readUTF(DataInputStream.java:572) 在 java.io.DataInputStream.readUTF(DataInputStream.java:547)在 ServiceRequest.run(ServiceRequest.java:41) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 在java.util.concurrent.FutureTask.run(FutureTask.java:138) 在 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor. java:918) 在 java.lang.Thread.run(Thread.java:680)

编辑:

它与 htonl 一起使用将整数从 C 客户端发送到 Java 服务器我得到了 int 但对于字符串我得到的是数字而不是字符

4

2 回答 2

0

您正在使用该htons函数将int值转换为网络字节顺序。

函数htonsfunction被定义为将little-endian主机上的字节重新排列为网络字节顺序(big-endian),而Java始终是big-endian。

但是这个函数转换的是 16 位值,而不是 32 位值。这是位:

4      = 00000100 00000000 00000000 00000000 (2^2) (little-endian)
262144 = 00000000 00000100 00000000 00000000 (2^18) (big-endian)

尝试使用htonl将 32 位int值转换为网络字节顺序的函数。那么这应该是结果。

4      = 00000100 00000000 00000000 00000000 (2^2) (little-endian)
4      = 00000000 00000000 00000000 00000100 (2^2) (big-endian)
于 2013-05-03T16:37:54.057 回答
0

262144 是十六进制 0x00040000,所以有些东西会改变你的字节顺序。

于 2013-05-03T16:38:03.717 回答