2016-07-02 40 views
-1

我認爲這可能是字節排序,但它看起來不像它。 我不知道還有什麼可以的。從Java客戶端通過套接字寫入int到c服務器

在Linux Java客戶端

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如果這是可能的。

+0

剛剛嘗試過,輸出相同 – Nicolas

+0

您的代碼不檢查可以通過read()返回的'result = -1'。 –

+0

是的,我想我會省略一些錯誤檢查這個問題。 – Nicolas

回答

4

的問題是在這裏:

&code + bytesRead 

這將在4(sizeof code)步驟增加的code地址,而不是你需要一個字節數組,或某種類型轉換。

+0

好的觀察,但只有一個問題,如果read()不讀取所有4個字節的第一次調用,這似乎不太可能。不過我同意先讀取字節數組更好。 – Andreas

+0

由於某種原因,它在一次讀取調用中通常讀取少於4個字節。謝謝,我會試一試。 – Nicolas

-3

你忘了設計和實現一個協議!您編寫了一段以一種格式發送數據的代碼,另一段代碼以完全不同的格式接收數據。決定格式,記錄格式,然後編寫以該格式發送的代碼,然後以該格式編寫接收代碼。

不要跳過文檔步驟。這是最重要的一個。準確記錄將使用什麼字節來傳達信息。

+0

你爲什麼認爲他們使用「完全不同的格式」? – Andreas

+0

他按網絡字節順序發送一個四字節的整數。你不能聲稱這不是一個協議。 – EJP

+0

@EJP不過他在發送,他以某種方式發送。但是如果他沒有記錄下來,就沒有辦法說這是他應該如何發送它。發生某種特定方式做某事不是一個協議。協議是關於事情*應該如何發生的規範。 –

相關問題