我正在使用#include <sys/socket.h>與服務器的庫套接字連接并使用vector型別char從套接字連接接收資料,如下所示:
struct sockaddr_in serv_addr;
int sock, valread;
sock = 0;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Socket creation error \n");
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// Convert IPv4 and IPv6 addresses from text to binary form
if (inet_pton(AF_INET, "0.0.0.0", &serv_addr.sin_addr) <= 0)
{
printf("\nInvalid address/ Address not supported \n");
}
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\nConnection Failed \n");
}
std::vector<char> buffer = {0};
buffer.reserve(1024);
read(sock, buffer.data(), 1024);
由于服務器回應大小在長度上是可變的但不超過,1024所以為什么將大小buffer固定為1024. 現在,由于我收到可變大小的回應,我想知道buffer. 我嘗試了以下操作:
std::cout<<sizeof(buffer)<<" "<<buffer.size();
和輸出是
sizeof(buffer) = 32
buffer.size() = 1
如果我嘗試1024產生一些垃圾值的值,如下所示:
for (int i = 0; i < 1024; i )
{
std::cout<<buffer[i];
}
輸出:
[{“xmin”:95,“ymin”:147,“ymax”:276,“xmax”:193},{“xmin”:42,“ymin”:353,“ymax”:488,“xmax”: 123},{“xmin”:85,“ymin”:19,“ymax”:166,“xmax”:145},{“xmin”:1,“ymin”:254,“ymax”:327,“xmax” “:107},{“xmin”:393,“ymin”:281,“ymax”:419,“xmax”:463},{“xmin”:379,“ymin”:316,“ymax”:457, "xmax": 442}] ! ) 0 8 ? G N V ] e l t { ? ? ? ギ
那么有什么辦法可以得到準確的回應大小呢?
uj5u.com熱心網友回復:
始終檢查 C 風格 API 中的回傳值!
C 樣式的 API 可直接從大多數其他編程語言(包括 C )呼叫。因為可移植 C 不支持拋出例外 C 風格的庫 API 被設計為通常通過回傳值(例如回傳值NULL或負值)來指示錯誤條件,而輸出資料(例如位元組緩沖區、結構指標等)則通過傳遞的指標傳遞作為引數。因為C暴露原始程式存盤器就意味著你可以很容易崩潰的行程(或者更糟......)如果您嘗試使用無效的指標,或者如果你使用的庫指出,它是在一個無效的狀態或終端設備狀態(例如eof在檔案流上)。
POSIX 的read函式回傳實際寫入緩沖區的位元組數。
https://man7.org/linux/man-pages/man2/read.2.html
成功時,回傳讀取的位元組數(零表示檔案結束),檔案位置按此數字前進。
如果此數字小于請求的位元組數,則不是錯誤;例如,這可能是因為現在實際可用的位元組較少(可能是因為我們接近檔案尾,或者因為我們正在從管道或終端讀取),或者因為
read()被信號中斷。
注意這部分:
例如,這可能會發生,因為現在實際可用的位元組數較少
...這意味著您需要read在回圈中呼叫直到它回傳零。
像這樣:
using std::vector<char>; // Consider using `std::Array` instead as it's a fixed-size buffer.
//
const size_t bufferLength = 1024;
vector<char> buffer(/*n:*/ bufferLength);
char* bufferPtr = buffer.data();
size_t totalRead = 0;
while( totalRead < bufferLength )
{
char* bufferPtrOffset = bufferPtr totalRead;
ssize_t bytesRead = read( /*fd:*/ sock, /*buffer:*/ bufferPtrOffset, /*count:*/ bufferLength - totalRead );
if( bytesRead < 0 )
{
// TODO: Error condition. Throw an exception or something.
}
else if( bytesRead == 0 )
{
break;
}
else
{
totalRead = bytesRead;
}
}
uj5u.com熱心網友回復:
根據@Dai。我應該使用函式的回傳值read
再次感謝。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/387202.html
上一篇:通過套接字發送Python物件
