Etkisi:Ben nasıl ve neden aşağıdaki kod kesimleri çalışmak mantıklı alamıyorum SO_SNDBUF
/* Now lets try to set the send buffer size to 5000 bytes */
size = 5000;
err = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(int));
if (err != 0) {
printf("Unable to set send buffer size, continuing with default size\n");
}
biz gönderme tamponunun değerini kontrol ederse, gerçekten de doğru 5000 * 2 = 10000 olarak ayarlanır Ancak, gönderme arabelleği boyutundan daha fazlasını göndermeye çalışırsak, tüm bunları gönderir. Örneğin:
n = send(sockfd, buf, 30000, 0);
/* Lets check how much us actually sent */
printf("No. of bytes sent is %d\n", n);
Bu yazdırır 30000
tam olarak bu çalışma yaptı nasıl? Gönderme arabelleği boyutunun 10000 ile sınırlı olmasının bir etkisi yok mu? Olsaydı, tam olarak ne oldu? Bir çeşit parçalanma mı?
GÜNCELLEME: Soket engelleme modunda değilken ne olur? 20000 (10000 x 2) 30000 bayt gönderilmesine neden olur tampon boyutunu değiştirme 16384 bayt gönderecektir neden olur 10000 (5000 x 2)
- değiştirme tampon boyutu: Aşağıdaki çalıştı
Bir kez daha, neden?
ve soket engelleme modunda değilse ne olur? Aşağıdakileri denedim: 1) Tampon boyutunu 10000 olarak değiştirmek için 16384 bayt neden olur 2) Arabellek boyutunu 20000 olarak değiştirmek için 30000 bayt neden olur Bir kez daha, neden? – Arun
@Arun: bu sadece yuvarlanıyor .. bu neden önemli? arabellek * tam * n bayt olduğu gerçeğine güvenmemelisiniz. çekirdek daha fazla tahsis edebilir. –
İlk olarak, çekirdek, arabellek boyutunuzu olduğu gibi @yi_H'nin işaret ettiği gibi almaz. Daha sonra, ağ yığını işleminize * uyumsuz olarak * çalışır. Aşağıdakileri deneyin - sokete yazmaya başlayın, ancak * diğer boyutta okuma *.Sonunda kısa bir süre alırsınız (çekirdek daha az bayt kabul eder, sonra verirsiniz) ya da yazamazsınız. –