Makale numarası: 138692 - Son Gözden Geçirme: 18 Ağustos 2005 Perşembe - Gözden geçirme: 1.3

Nasıl bir zaman aşımı CSocket operasyonlar yapılandırılır.

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Bu işlevler bir ça?r? döndürmez, yuva üstündeki bir hata oluştu ya da başarıyla tamamlayana kadar algılama işlemleri engelleyen CSocket işlemlere, Bağlan, alma ve gönderme.

Bazı koşullarda, operasyonun hiçbir zaman başarıyla tamamlanamadı ve programınız için bu tamamlanması beklenirken sonsuza kadar döngü. Program aracılığıyla işleminin tamamlanması için izin verilen süre miktarını sınırlamak için iyi bir fikir olabilir. Bu makalede, bunu bir yolu anlatılır.

Daha fazla bilgi

Bir yaklaşım, işlem çok uzun sürdü, harekete bir süreölçer ayarlanmış olacaktır. Bu yaklaşımın süreölçeri nasıl işlendiğini anahtarıdır. "Işlem engelliyor, ancak" hala gelen iletileri işlemek için özelliği de vardır. SetTimer kullanarak bir süreölçer ayarlarsanız, daha sonra WM_TIMER ileti bakın ve geldiğinde, işlemi iptal etmek. Bu işlemde kullanılan birincil işlevler şunlardır:
Windows API çağrısı:
:: SetTimer
MFC işlevleri:
CSocket::OnMessagePending
CSocket::CancelBlockingCall
Kolaylık olması açısından, bu işlev, CSocket-türetilmiş sınıf kapsüllenmiş.

UYARı: başka okuma önce bazı sorunlara yol açıp OnMessagePending geçersiz kılmak ve bir süreölçeri çalışırsanız, MFC sürümlerinde bir hata olduğunu unutmayın. Bu sorun, aşağıdaki Microsoft Bilgi Bankası makalesinde belgelenmiştir:
137632  (http://support.microsoft.com/kb/137632/EN-US/ ) Hata: bir süreölçer Active olduğunda Aranan OnMessagePending değil
Bu makale, yalnızca sürümler için 1.52 1.52b, 2.1 ve Visual C++, 2.2 geçerlidir. Visual C++'ın bu sürümlerini kullanıyorsanız, daha sonra de sağlanan geçici çözümü gerekir.

Bu zaman aşımı olanağı sağlayan bir sınıf için örnek kod, bu makalenin sonunda bulunmaktadır. Sınıfı tarafından uygulanan işlevleri, bu makalede aşağıdaki bölümlerde açıklanmıştır.

BOOL SetTimeOut(UINT uTimeOut)

Bu hemen CSocket işlevi (örnek, Receive, send ve kabul) çağırmadan önce çağrılması. Milisaniye cinsinden uTimeOut parametresi belirtildi. Aşağıdaki uygulama yalnızca süreölçer ayarlar. Süreölçer ayarlama denemesi başarısız oldu, bu işlev, YANLıŞ değerini verir. Daha fazla ayrıntı için SetTimer işlevi Windows API belgelerine bakın.

BOOL KillTimeOut()

Bu işlev engelleyen işlemi tamamlandıktan sonra çağrılması gerekir. Bunu SetTimeOut ile ayarlanan süreölçeri kaldırır. KillTimer çağrısı başarısız oldu, YANLıŞ değerini verir. Daha fazla ayrıntı için KillTimer işlevi Windows API belgelerine bakın.

BOOL OnMessagePending()

Bir işlemin tamamlanmasını bekliyor CSocket sınıf adlandırılır, sanal bir geri arama budur. Gelen iletiler bir şey yapın olanağı verir. Bu uygulama ile SetTimeOut görüşmesi süreölçer WM_TIMER ileti için denetler. Ve, sonra da geldiğinde, CancelBlockingCall işlevini çağırır. Ayrıntılar için OnMessagePending ve CancelBlockingCall işlevleri MFC belgelerine bakın. Arama CancelBlockingCall, işlemin başarısız olmasına neden olur ve GetLastError WSAEINTR (kesilen işlem gösteren) döndürecektir olduğunu unutmayın.

Işte bu sınıfın bir örnek Kullanım:
   ...
   CTimeOutSocket sockServer;
   CAcceptedSocket sockAccept;

   sockServer.Create(777);
   sockServer.Listen();

   // Note the following sequence:
   //  SetTimeOut
   //  <operation which might block>
   //  KillTimeOut

   if(!sockServer.SetTimeOut(10000))
   {
     ASSERT(FALSE);
     // Error Handling...for some reason, we could not setup
     // the timer.
   }

   if(!sockServer.Accept(sockAccept))
   {
     int nError = GetLastError();
     if(nError==WSAEINTR)
       AfxMessageBox("No Connections Arrived For 10 Seconds");
      else
        ; // Do other error processing.
   }

   if(!sockServer.KillTimeOut())
   {
     ASSERT(FALSE);
     // Error Handling...for some reason the timer could not
     // be destroyed...perhaps a memory overwrite has changed
     // m_nTimerID?
     // 
   }
   ...
				

Örnek kod

   // 
   // HEADER FILE
   // 
   class CTimeOutSocket : public CSocket
   {
   public:
     BOOL SetTimeOut(UINT uTimeOut);
     BOOL KillTimeOut();
   protected:
     virtual BOOL OnMessagePending();
   private:
     int m_nTimerID;
   };
   // 
   // END OF FILE
   // 


   // 
   // IMPLEMENTATION FILE
   // 
   BOOL CTimeOutSocket::OnMessagePending()
   {
     MSG msg;
     if(::PeekMessage(&msg, NULL, WM_TIMER, WM_TIMER, PM_NOREMOVE))
     {
       if (msg.wParam == (UINT) m_nTimerID)
       {
         // Remove the message and call CancelBlockingCall.
         ::PeekMessage(&msg, NULL, WM_TIMER, WM_TIMER, PM_REMOVE);
         CancelBlockingCall();
         return FALSE;  // No need for idle time processing.
       };
     };

     return CSocket::OnMessagePending();
   }

   BOOL CTimeOutSocket::SetTimeOut(UINT uTimeOut)
   {
     m_nTimerID = SetTimer(NULL,0,uTimeOut,NULL);
     return m_nTimerID;
   }

   BOOL CTimeOutSocket::KillTimeOut()
   {
     return KillTimer(NULL,m_nTimerID);
   }
				

Referanslar

SetTimer ve KillTimer işlevleri hakkında daha fazla bilgi için lütfen Windows API Yardım dosyasına bakın.

CSocket sınıfı ve üye işlevleri hakkında daha fazla bilgi için lütfen bkz:
Visual C++ 2.x da - MFC Yardım dosyası.
Visual C++ 1.5 x - The Mfcext.hlp Yardım dosyası, \Msvc15\Help dizininde <a1>CD</a1> diskinde bulunur.

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Foundation Class Library 4.2
Anahtar Kelimeler: 
kbmt kbapi kbcode kbhowto kbnetwork kbtimer kbwinsock KB138692 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:138692  (http://support.microsoft.com/kb/138692/en-us/ )
Retired KB ArticleKullanım Dışı Bilgi Bankası İçeriği Yasal Uyarı
Bu makale, Microsoft'un artık destek sağlamadığı ürünler ile ilgili olarak yazılmıştır. Bu nedenle, bu makale "olduğu gibi" sağlanmıştır ve bundan sonra güncelleştirilmeyecektir.