Xem nhận xét: Tôi đã sửa. Tôi đã được biên soạn. Tuy nhiên, tôi vẫn nghĩ rằng nó là hạt để dựa vào internals như thế này. Trình biên dịch microsoft cuối cùng mà tôi đã sử dụng đã vi phạm các tiêu chuẩn C99 khiến tôi không còn đau buồn nữa. Nếu họ không thể nhận được giá trị trả lại ngay trên vsnprinf() hoặc mới, bạn có thực sự muốn dựa vào errata như thế này không?
Bạn đang đưa ra các giả định về cách thực hiện vectơ. Bạn giả định rằng v [1] xuất hiện ngay sau khi v [0] trong bộ nhớ.
Có sự khác biệt giữa char buf []; & buf [1] == & buf [0] + 1 và vectơ v; & v [1] == & v [0] + 1. Mảng char sử dụng số học con trỏ. Vector sử dụng toán tử []. Cách vector lưu trữ dữ liệu trong nội bộ, cho dù đó là liền kề hay không, là tùy thuộc vào lớp vectơ đó.
Mặc dù mã của bạn vẫn có thể hoạt động, đây vẫn là một điều là
BAD! Nó làm cho phần mềm của bạn trở nên giòn, khiến nó vỡ ra theo những cách kỳ lạ và mong đợi khi bạn ít mong đợi nó nhất!
Đây là một tình huống lý tưởng cho một mảng char tạm thời trên ngăn xếp cục bộ. Kích thước nhỏ. Bạn có kích thước tối đa được mã hóa cứng.
Nếu kích thước không đổi, tôi vẫn sử dụng bộ đệm mảng cục bộ nhỏ trên ngăn xếp. Tôi chỉ cần thêm nó vào một C++ std :: string sau mỗi lần lặp. (Có, std :: chuỗi có thể lưu trữ các giá trị nhị phân bao gồm nhiều ký tự null.)
recv() trả về số byte đọc. Vector v không tự động chọn tùy chọn này. Vì vậy, bạn cần lưu trữ và sử dụng giá trị đó.
Tôi đề nghị:
#define BUFFER_SIZE (1024*16)
#define FLAGS 0
int received = 0;
int total = 0;
char buffer [ BUFFER_SIZE + 1 ];
memset(buffer, 0, BUFFER_SIZE + 1);
received = recv(sockfd, buffer, BUFFER_SIZE, FLAGS);
if (received > 0)
{
copy(buffer + total,
buffer + total + received,
ostream_iterator<char>(cout));
total += received;
}
while((received > 0) && (total < BUFFER_SIZE))
{
received = recv(sockfd, buffer + total, BUFFER_SIZE - total, FLAGS);
if (received > 0)
{
copy(buffer + total,
buffer + total + received,
ostream_iterator<char>(cout));
total += received;
}
}
buffer [ total ] = '\0';
buffer [ BUFFER_SIZE ] = '\0';
cout << "The total size is " << total << endl;
Mã này bị hỏng. Thật kinh khủng như vậy. Sử dụng một vector để phân bổ một mảng (đó là những gì cơ bản đang xảy ra ở đó) không chỉ nguy hiểm (các vector là MEANT để tái phân bổ mảng nội bộ của chúng!) Mà còn vô nghĩa. –
Ít nhất sử dụng v.resize (1024 * 16) nếu bạn * phải * sử dụng một véc tơ, nhưng như đã đề cập bởi dionadar, làm theo cách này không phải là một ý tưởng hay và về cơ bản không bảo vệ bạn khỏi bất cứ điều gì và có thể dẫn đến một số đêm thú vị gỡ lỗi mã này. –
có vấn đề gì với việc sử dụng véc tơ của anh ta? nếu kích thước là động, tôi không thấy bất cứ điều gì xấu với nó –