SORU
19 Mayıs 2010, ÇARŞAMBA


Ne kadar büyük al benim tampon yuva kütüphanede al çağırırken olmalıdır

C. soket kitaplığı Burada sorularıma bakın edeceğim bir kod parçacığı ile ilgili bir kaç sorum var.

char recv_buffer[3000];
recv(socket, recv_buffer, 3000, 0);
  1. Nasıl recv_buffer nasıl karar verebilirim? 3000, ama keyfi olarak bunu kullanıyorum.
  2. recv() bir paket tampon daha büyük alırsa ne olur?
  3. nasıl tekrar al arama olmadan tüm mesajı almış olacak ve alınan bir şey olduğu zaman sonsuza kadar beklemek zorunda?
  4. bu ekleme alanı dışında çalışan korkusu olmadan tutmak böylece bir tampon alan sabit bir miktar değil yapabilirim bir yolu var mı? belki de strcat bellek recv() son yanıt bağlamak için kullanıyor?

Bir çok soru olduğunu biliyorum, ama büyük ölçüde herhangi bir yanıt seviniriz.

CEVAP
19 Mayıs 2010, ÇARŞAMBA


Eğer bu soruların değişir bağlı olarak kullanmadığınızı bir akış soket (SOCK_STREAM) veya bir UDP soketine (SOCK_DGRAM) - içinde TCP/IP, eski karşılık gelen TCP ve ikincisi için UDP.

Nasıl tampon recv() geçti yapmak için nasıl biliyor musunuz?

  • SOCK_STREAM: çok önemli - sadece bir boyutu (3000 iyidir) almak değil. Büyük tamponlar eğer büyük miktarda veri aktarım yapıyorsanız daha verimli olacaktır.

  • SOCK_DGRAM: bir tampon düzey uygulama protokolü şimdiye dek gönderdiği en büyük paket alacak kadar büyük Kullanın. Eğer UDP kullanarak iseniz, o zaman genel olarak düzey uygulama protokolü kesinlikle parçalanmış ve yeniden için ihtiyaçları olacak çünkü yaklaşık 1400 bayt gönderme paketleri daha büyük olmamalı.

Eğer recv bir paket tampon daha büyük olursa ne olur?

  • SOCK_STREAM: Bu soru gerçekten akışı yuva paketleri kavramı sadece bayt sürekli bir akış onlar yok çünkü dediği gibi mantıklı değil. Eğer daha fazla bayt arabellek için oda var daha okumak için kullanılabilir eğer, o zaman işletim sistemi tarafından atılmış ve recv sonraki çağrı için geçerli olacak.

  • SOCK_DGRAM: aşırı bayt atılır.

Nasıl eğer tüm mesaj aldım biliyor olabilir miyim?

  • *14: ileti son düzey bir uygulama protokolü. içine belirleyici bir yol inşa etmek gerekir Genellikle bu ya bir önek uzunluğu (başlangıç her iletinin uzunluğu ileti) ya da bir son ileti ayırıcı (hangi olabilir sadece bir yeni satır metin tabanlı bir protokol, örneğin). Daha az kullanılan üçüncü bir seçenek, her mesaj için sabit bir boyut yetki. Bu seçeneklerin kombinasyonları da mümkün, örneğin, bir uzunluk değeri içeren boyutu sabit bir başlık var.

  • SOCK_DGRAM: recv çağrı her zaman döndürür tek bir veri birimi. Bir tek

Bu ekleme alanı dışında çalışan korkusu olmadan tutmak böylece bir tampon alan sabit bir miktar değil yapabilirim bir yolu var mı?

Hayır. Ancak, arabelleği realloc() aslında malloc() calloc() ile ayrılmış olsaydı () kullanarak yeniden boyutlandırmak için deneyebilirsiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dylan Brenan

    Dylan Brenan

    22 Aralık 2009
  • OVERWERK

    OVERWERK

    6 Temmuz 2010
  • The Scary Snowman

    The Scary Sn

    1 ŞUBAT 2011