2012-01-22 93 views
0

我正在做我的學習東西,所以是的,這是作業轉換uint32_t到網絡字節順序

第一:我得到了一個可以工作的Java服務器應用程序,我也有這個客戶端應用程序,我現在用java編寫c程序。 很簡單,我無法將uint32_t發送到我的java服務器。

因此,讓我們炫耀一些代碼:

char* callString(char func, char* str, uint32_t anz) { 

    uint32_t packageLength, funcLength, strLength; 
    funcLength = htonl(sizeof(func)); 
    strLength = htonl(strlen(str)); 
    uint32_t byte = htonl(4); 
    uint32_t trailing = htonl(1); 
    anz = htonl(anz); 

    packageLength = byte + byte + funcLength + byte + strLength + byte + byte + trailing; 
    /*packageLength = htonl(packageLength);*/ 

    char byteBuffer[ntohl(packageLength)]; 


    printf("%i\n", packageLength); 
    printf("%i\n", htonl(packageLength)); 
    printf("%i\n", ntohl(packageLength)); 

    sprintf(byteBuffer, "%i%i%c%i%s%i%i%c", packageLength, byte, func, byte, str, byte, anz, '\0'); 

    printf("%s\n", byteBuffer); 

    if(write(sock, byteBuffer, packageLength) < 0) { 
    printf("write: Konnte keine Daten zum gegenüber senden.\n"); 
    exit(EXIT_FAILURE); 
    } 
    char* retVal = "hallo"; 
    return retVal; 
} 

簡單的是,我打電話與FUNC =「V」這個功能,海峽=「你好」和ANZ = 2 ,這將給我的packageLength 27個字節。

包是建立這樣的:
= packageLength(INT),它是4字節
+長度函數描述符(funcLength),它是4字節
+ FUNC描述符(FUNC),其是funcLength
的+長度參數1的(strLength),它是4字節
+長度的參數1(STR)的值,它是strLength
+長度param2的也就是4字節
+長度的參數2的值(ANZ),它是4字節
的+ NULL字節(\ 0)這是1個字節

我假設我做的轉換是錯誤的也許我使用了錯誤的數據類型。在服務器端,我使用Java ByteBuffer來收集數據。起初,我從網絡上讀取的4字節packagelength這會給我的,我有多少時間閱讀,直到我得到整個數據包的信息:

byte[] msgLength = new byte[4]; 
try { 
handle.getInputStream().read(msgLength); 
} catch (IOException ex) { 
    System.out.println("could not receive byte stream: msgLength"); 
    break; 
} 
ByteBuffer receive; 

receive = ByteBuffer.wrap(msgLength); 

int packageLength = receive.getInt(); 
System.out.println("packageLength" + packageLength); 

最後的println會給我下面的輸出:

packageLength875901497

因此,沒有人現在在哪裏我的問題是什麼?如有必要,我可以爲您提供更多代碼,但我認爲錯誤是數據類型(uint32_t)或轉換。

幫助被appriciated。提前致謝。

乾杯 丹尼爾

回答

2
funcLength = htonl(sizeof(func)); 
strLength = htonl(strlen(str)); 
uint32_t byte = htonl(4); 
uint32_t trailing = htonl(1); 
anz = htonl(anz); 

packageLength = byte + byte + funcLength + byte + strLength + byte + byte + trailing; 

你將大小網絡秩序和然後相加,然後爲packageLength。您應該將它們加在一起之前將它們轉換爲網絡訂單與htonl

除此之外,這一切:

sprintf(byteBuffer, "%i%i%c%i%s%i%i%c", packageLength, byte, func, byte, str, byte, anz, '\0'); 

是錯誤的,因爲我認爲你要送他們爲二進制,但使用上述sprintf就送他們在基地10 ASCII表示(即你」重新發送數字作爲文本!)

+0

這是一些試驗和錯誤的作品,我做了。但我再次改變它,我得到這樣的 uint32_t packageLength, funcLength, strLength; funcLength = sizeof(func); strLength = strlen(str); anz = htonl(anz); packageLength = 4 + 4 + funcLength + 4 + strLength + 4 + 4 + 1; /*packageLength = htonl(packageLength);*/ strLength = htonl(strLength); funcLength = htonl(funcLength); uint32_t byte = htonl(4); uint32_t trailing = htonl(1); char byteBuffer[packageLength]; packageLength = htonl(packageLength); Daniel

+0

在Java中我有一個ByteBuffer是我把數據,它給了我的方法.putInt().put()把東西放在一個字節緩衝區,然後發送ByteBuffer 。我不知道如何將數據打包到字符數組中。 – Daniel

+0

儘管如此,我在服務器端使用更改後的代碼(請參見上文)獲取相同的packageLength:packageLength875901497如何告訴c將二進制數據寫入套接字? – Daniel

相關問題