2017-03-04 66 views
0

當使用伯克利套接字api時,通過讀取/發送或寫入/接收呼叫發送的內容的數據類型是什麼?例如 -什麼是通過套接字發送的內容的數據類型?

char *msg = "Our Message!"; 
int len, bytes_sent; 
len = strlen(msg); 
bytes_sent = send(sockfd, msg, len, 0); 
在這段代碼

,我們使用的是char類型,但我們只限於char類型,因爲發送/寫/ SENDTO通常採取void *類型。我也看到過,如果我們發送一些int,它可能實際上存儲在小端/大端,如果它們的端點不匹配,會導致問題b/w源/目標。那麼爲什麼char類型也遭受這個問題呢?

另外像C和C++這樣的不同語言也有不同的大小char,那爲什麼這不是問題呢?如果套接字不關心任何type,只是將內容視爲緩衝區,爲什麼我們不看到隨不同tcp服務器/客戶機使用不同語言編寫並相互通信時的數據隨機損壞?

總之,可以通過套接字安全地發送什麼值(類型)?

+0

「不同的語言像C和C++有不同的字符大小」不,在C和C++中,字符的大小都是1. –

+0

@NeilButterworth哦所以字面'a'的大小必須是4 = –

+0

最安全的方法是發送一個字節緩衝區,'char'總是1個字節。所有爲此設計的語言都有這樣的數據類型。 – DeiDei

回答

4

您無法通過原始套接字安全地發送任何內容,並期望接收方理解它。例如,發送過程可能位於字符編碼爲EBCDIC的計算機上,接收過程可能位於字符編碼爲ASCII的計算機上。這需要通過協商協議來解決這個問題,或者只是在他們的規範中說「我們正在使用ASCII碼(或其他)」。

一旦你得到了編碼的字符編碼,傳輸文本中的數據是我的建議。這避免了所有endian問題,並且更容易調試和記錄。

4

最簡單的答案是數據是一個未經解釋的八位字節流,也就是說8位字節。它的任何表述都由發送者和接收者完成,他們更好地同意。您當然需要考慮整數的大小和字節順序,以及編譯器對齊和填充規則。這就是爲什麼例如你不應該使用C結構作爲網絡協議。