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.DataInputStream.readUnsignedShort(DataInputStream.java:323) での java.io.EOFException 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 サーバーに整数を送信します

4

2 に答える 2

0

関数を使用して、値をネットワーク バイト オーダーhtonsに変換しています。int

関数htonsfunction は、リトル エンディアン ホスト上のバイトをネットワーク バイト オーダー (ビッグ エンディアン) に再配置するように定義されており、Java は常にビッグ エンディアンです。

ただし、この関数は 32 ビット値ではなく 16 ビット値を変換します。ビットは次のとおりです。

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

htonl32 ビット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 は 16 進数の 0x00040000 なので、何かがバイト順を変更します。

于 2013-05-03T16:38:03.717 に答える