2013-05-20 73 views
1

我是新來的套接字編程,以測試一些情況下,我使用Java端客戶端通過套接字發送整數數據我想在cpp中的服務器端接收這些數據。像無法接收數據(recv在CPP)放入套接字(在Java中寫()())

out=new DataOutputStream(s.getOutputStream()); 
ar=1; 
le=1; 
out.writeInt(ar); 
out.flush(); 
out.writeInt(le); 
out.flush(); 

和IM使用recv函數在CPP接收這個數據

我在客戶端(JAVA)的代碼看起來。上CPP側的代碼看起來像

if (int(recv(acceptFD, &number, sizeof(int), 0)) != sizeof(int)) 
    { 
    ALOGE ("error reading on socket: number of Args: %d,reutrned value =%d\n",number); 
    return; 
    } 

    for (int i = 0; i < number; i++) 
    { 
    int len; 
    if (recv(acceptFD, &len, sizeof(int), 0) != sizeof(int)) 
    { 
     ALOGE ("error reading on socket: Len of Args: expected length :%d\n",len); 
     freeDebugCallbackArgs(i, args); 
     return; 
    } 

及其表示日誌作爲

E/RILC(235):錯誤閱讀插座:數參數數量的:16777216,返回值= -1073741824 E/RILC(235):插座上的誤差讀數:參數長度:期望長度:1075093557

如果有人發佈對此的答案,這將是一個很大的幫助。 謝謝

+0

請顯示您如何聲明號碼。另外,recv的回報值是多少? – Rolle

+0

數字被聲明爲整數。返回值= -1073741824是從recv – user2401368

回答

0

我stongly懷疑這是用字節順序的問題。

表示爲十六進制數16777206是爲0x01000000,這是在1677206小端表示,但1大端表示。

讀取您的數字作爲一個字節數組,包括碼,以補償Java源和C目的地之間的不同字節順序。

+0

返回的值可以更具體請。這個小端和大端的概念總是讓我感到困惑。你可以給我一個例子 – user2401368

+0

當然。不同的計算機以不同的方式記錄整數,這兩種最常用的方式被稱爲big-endian和little-endian,只是爲了說明它有多混淆,我的回答是倒退。 ;)參見http://en.wikipedia.org/wiki/Endianness爲了表示數字1,可以使用四個字節0​​0 00 00 01,最後一個字節是最低有效字節。您也可以使用四個字節0​​1 00 00 00,最低有效字節在前。連接的兩端不使用相同的字節順序,所以數字出錯了。 –

+0

你嘗試將int轉換爲大端,它完美地工作。非常感謝 – user2401368