2016-07-02 13 views
-1

私はそれがバイトオーダーであるかもしれないと思ったが、それはそれのようには見えない。 私は他に何ができるか分かりません。プリントアウトするのlinux ソケットを介してJavaクライアントからCサーバにintを書き込む

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); 

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上

Javaクライアント:

-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のを使用して、まだ簡単なソリューションに興味があります。

+0

同じ出力を試しました。 – Nicolas

+0

あなたのコードは、 'read()'によって返される 'result = -1'をチェックしません。 –

+0

さて、私はこの質問のために何らかのエラーチェックを残しておくことにしました。 – Nicolas

答えて

4

問題はここにある:

&code + bytesRead 

これは、あなたがバイト配列、またはいくつかの型キャストを必要とする1、4(sizeof code)のステップでcodeのアドレスではなく増加します。

+0

'read()'が最初の呼び出しで4バイトすべてを読み込まない場合にのみ問題があります。私はバイト配列に最初に読む方が良いということに同意します。 – Andreas

+0

1回の読み込み呼び出しでこれまで何らかの理由で4バイト未満の読取りを頻繁に行っています。ありがとう、私はそれを試してみましょう。 – Nicolas

-3

プロトコルを設計し実装するのを忘れてしまった! 1つのフォーマットでデータを送信する1つのコードと、全く異なるフォーマットでデータを受信する別のコードを書きました。書式を決定し、その書式を文書化し、その書式で送信するコードを書いて、その書式で受け取ったコードを書いてください。

ドキュメントの手順を省略しないでください。それが最も重要なものです。情報を伝達するために使用されるバイトを正確に文書化する。

+0

なぜ「まったく異なるフォーマット」を使用していると思いますか? – Andreas

+0

彼はネットワークバイトオーダーで4バイトの整数を送信しています。あなたはそれがプロトコルではないと主張することはできません。 – EJP

+0

@EJPしかし、彼は送る、彼は何とかそれを送信しています。しかし、もし彼がそれを文書化していなければ、それが彼がそれを送る方法であるかどうかを言う方法はありません。何か特別なやり方をすることは、プロトコルではありません。プロトコルとは、何が起こるべきかの仕様です。 –

関連する問題