[英]Sending data over TCP between Java and C++
我有一個應用程序,該應用程序不斷從幀緩沖區中獲取Java輸入並將其通過電線發送到C ++應用程序。
我在接收器端遇到問題。 我正在嘗試為每個幀緩沖區發送一個數據包(或至少讓TCP將其重構為單個數據包)。 幀緩沖區在接收端被拆分為多個小數據包。
Java代碼如下:
OutputStream os = clientSocket.getOutputStream();
FileInputStream fos = new FileInputStream("fb");
while (true) {
int nb = fos.read(buff);
if (nb <= 0)
break;
os.write(buff, 0, nb);
}
fos.close();
os.close();
在客戶端,我試圖讀取相同的金額。 nb和size在這里是相同的值:
n = read(sockfd, buffer, size);
while (n > 0) {
// We have a new frame
fprintf(stderr, "New frame: %d\n", n);
n = read(sockfd, buffer, size);
}
打印的n的值比大小小得多。 當我希望read()的返回將是大小為“ size”(或nb)的數據包時,它將收到很多數據包。
有誰能知道為什么嗎?
非常感謝您的幫助!
您無法控制TCP幀大小。 網絡設備可以並且可以對數據包進行分段,以便您收到的數據包比發送的數據包還要多。
使用“流”一詞是有很好的理由的。 您正在獲得字節流,但是沒有成幀,除非發送方和接收方應用程序通過在數據中包括幀標記將流強加到幀上。 許多TCP協議使用的一種常見方式是使用\\r\\n
作為幀標記。 這意味着接收器收集傳入的數據,但直到遇到幀標記時才對其進行處理。 此時,接收器處理一幀,然后繼續尋找下一個幀標記。
您應該考慮的一件事是使用像ZeroMQ這樣的跨平台跨語言庫來為您處理幀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.