recv sẽ trở lại khi có dữ liệu trong bộ đệm trong để quay lại. Nó sẽ không đợi cho đến khi có 100 byte nếu bạn yêu cầu 100 byte.
Nếu bạn đang gửi 100 byte "thư", hãy nhớ rằng TCP không cung cấp thư, đó chỉ là luồng. Nếu bạn đang xử lý các thông điệp ứng dụng, bạn cần phải xử lý nó ở tầng ứng dụng vì TCP sẽ không làm điều đó.
Có nhiều, nhiều điều kiện trong đó cuộc gọi send() 100 byte có thể không được đọc đầy đủ ở đầu kia chỉ với một cuộc gọi recv khi gọi recv (..., 100); đây chỉ là một vài ví dụ:
Việc gửi TCP stack quyết định bó cùng nhau 15 ghi cuộc gọi, và MTU xảy ra là 1460, trong đó - tùy thuộc vào thời gian của dữ liệu đến có thể gây ra các khách hàng đầu tiên 14 các cuộc gọi để tìm nạp 100 byte và lệnh gọi để tìm nạp 60 byte - 40 byte cuối cùng sẽ đến vào lần tiếp theo bạn gọi recv().(Nhưng nếu bạn gọi recv với bộ đệm là 100, bạn có thể nhận được 40 byte cuối cùng của thông báo "ứng dụng" trước đó và 60 byte đầu tiên của thông báo tiếp theo)
Bộ đệm người gửi đầy, có thể người đọc chậm hoặc mạng bị tắc nghẽn. Tại một số thời điểm, dữ liệu có thể đi qua và trong khi làm trống vùng đệm dữ liệu cuối cùng không phải là bội số của 100.
Bộ đệm nhận đầy, trong khi ứng dụng của bạn recv() dữ liệu, đoạn cuối cùng kéo lên chỉ là một phần vì toàn bộ 100 byte của thông điệp đó không phù hợp với bộ đệm.
Nhiều trường hợp này khá khó kiểm tra, đặc biệt trên làn đường nơi bạn có thể không bị tắc nghẽn hoặc mất gói dữ liệu - mọi thứ có thể khác nhau khi bạn tăng tốc độ gửi tin nhắn/được sản xuất.
Dù sao đi nữa. Nếu bạn muốn đọc 100 byte từ một ổ cắm, sử dụng giống như
int
readn(int f, void *av, int n)
{
char *a;
int m, t;
a = av;
t = 0;
while(t < n){
m = read(f, a+t, n-t);
if(m <= 0){
if(t == 0)
return m;
break;
}
t += m;
}
return t;
}
...
if(readn(mysocket,buffer,BUFFER_SZ) != BUFFER_SZ) {
//something really bad is going on.
}
Cảm ơn bạn đã giải thích chi tiết. Chỉ cần xác nhận nếu điều này là đúng cho * chặn * recv() gọi là tốt? (ví dụ: recv() trả lại với số byte nhỏ hơn yêu cầu) – Adil
Có, điều này đúng với cuộc gọi chặn cuộc gọi. – nos