2013-05-09 87 views
-3

我正在使用TCP套接字。我正在使用寫入功能將數據發送到打開的套接字。C write()函數發送2個字節的十六進制

write(Socket_Fd,「test」,4);

這是有效的。但是當我這樣做時。

#include <stdio.h> 
#include <stdlib.h> 

typedef unsigned char BYTE; 

typedef struct LANC 
{ 
BYTE START; 
BYTE END; 

} LCODE; 


int main(int argc, char *argv[]){ 

LCODE COMMAND; 
COMMAND.START = 0x28; 
COMMAND.END = 0x06; 

short value = (COMMAND.START << 8) | COMMAND.END; 

write(socket_FD, value, sizeof(value); 

return 0; 
} 

當我檢查值的大小我得到2個字節這是正確的,因爲我結合了0x28和0x06。所以做一個printf。

printf("%x\n", value); 

output is: 2806 which is correct. 

printf("%d\n", sizeof(value); 

output is: 2 bytes which is correct. 

我在嘗試使用write將十六進制寫入打開的套接字時出現錯誤。我究竟做錯了什麼?

+1

你對你的問題的描述是不明確的。在你的示例代碼中,'socket_FD'不是有效的套接字句柄,所以我認爲這不是你真正的代碼。你可以更新你的問題,以顯示真實的代碼嗎?更好的描述「我得到一個錯誤」也會有幫助。 – simonc 2013-05-09 12:29:00

+2

'我正在嘗試使用寫入將十六進制寫入打開的套接字時出現錯誤。我做錯了什麼?'你*不*顯示失敗的代碼;只有有效的代碼。 – wildplasser 2013-05-09 12:29:04

+0

@simonc,是的,這不是真正的代碼,我只是做了它,但它是我得到錯誤的完整代碼的一部分,我現在沒有完整的代碼,因爲我在家裏,代碼是在辦公室。我得到的錯誤是寫功能。例如傳遞一個int類型的值來寫入函數。 – demic0de 2013-05-09 12:33:45

回答

3

你在一行中提交了兩個令人厭惡的錯誤(它是如何編譯的?)。你傳遞一個整數(值)到write()它期望一個指針(不會編譯,你試圖欺騙我們關於你的代碼)。其次,你正在做一些與endian有關的事情,也就是說,在不同的處理器上,你會得到不同的結果,這取決於「value」的高位字節在內存中是第一位還是第二位。

解決方案:

unsigned char value[2] = {COMMAND.START, COMMAND.END}; 

write(socket_FD, value, sizeof(value)); 
+2

另外,請檢查'write()'的返回值。 – 2013-05-09 12:36:38

+0

對不起,這只是我從頭開始創建的一個虛擬示例代碼,而不是真正的代碼。而且是的,我忘了提到它不會編譯,因爲我得到寫函數的錯誤。 – demic0de 2013-05-09 12:39:48

+0

所以你在家裏的實際代碼甚至沒有編譯?在提出任何問題之前解決該問題請儘快閱讀[常問問題](http://stackoverflow.com/faq),並始終制作一份SSCCE([簡短,獨立,正確的示例](http://sscce.org/)),因爲這有助於人們幫你。 – 2013-05-09 12:42:05

相關問題