Makale numarası: 150523 - Son Gözden Geçirme: 11 Temmuz 2005 Pazartesi - Gözden geçirme: 3.3

Farklı Windows platformları üzerinde yuva devralma

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

Belirtiler

Microsoft Windows 95 ve Microsoft Windows 98 işleme devralınması Winsock tanıtıcıları Microsoft Windows NT ve Microsoft Windows 2000'den farklı bir şekilde DuplicateHandle() kullanırken yuva. Bu makalede, farkları özetler.

Not Winsock 2'de WSADuplicateSocket/WSASocket Windows platformları üzerinde yuva paylaşımı için önerilen yöntemdir.

Durum

Microsoft, "Geçerli Olduğu Ürünler" bölümünde listelenen Microsoft ürünlerinde bu sorunun olduğunu onaylamıştır.

Microsoft, bu sorunu araştırmaktadır ve yeni bilgiler hazır olduğunda bu makalede yayımlayacaktır.

Daha fazla bilgi

Yuva tanıtıcısı varsayılan devralınabilir olup, Windows NT ve Windows 2000 altında. Bu özellik Uzak bağlantının diğer ucundaki uygulama etkileşimde alt işlemin bir alt işlem spawn ve istediği bir işlem tarafından kullanılır.

Genellikle standart ayarlamak için Windows NT'de olduğu için yuva tanıtıcısı alt işlemin tanıtıcıları (standart giriş, çıkış veya hata). Bu gibi durumlarda, alt işlem genellikle standart tutamaçlarından gerçekten yuva olduğunu bilmez.

Windows 9 x, Windows NT/Windows 2000'den aşağıdaki şekilde değişir:
  • Yuva tanıtıcısı oluşturduğunuzda, bu devralınabilir değildir. Bir alt işlem edinmek ve üst içinde oluşturulmuş bir yuva tanıtıcısı kullanmak emin olmak için tanıtıcı açıkça Win32 API DuplicateHandle kullanılarak çoğaltılmalıdır. Apı bInheritHandle parametresini TRUE olarak ayarlanır.
  • Yuva tanıtıcısı için alt işlemin standart tanıtıcıları ayarlanamaz. Yuva tanıtıcısı, alt işlem, yalnızca bağımsız değişken vektörünü arayabilirsiniz, komut satırı bağımsız değişkenleri tanıtıcı değerler geçirmeden gibi istemcinin geçirmek için diğer BIR programcı kullanabilir.

Örnek kod

Aşağıdaki örnek kod, alt işlemler hem Windows 9, yuva devralan uygulamaları yazmak verilmektedir x ve Windows NT/Windows 2000.

Not Bu kod yalnızca 32 bit, 16 bit uygulamalar yuva tanıtıcısı devralamaz.
   // This is a Winsock server that is listening on a port.

   // When a client connects, the server spawns a child process and
   // passes the socket handle to the child.
   // The child can use this socket handle to interact with the
   // client and the parent is free to go back to waiting for
   // other clients to connect.

   OrigSock=accept(listen_socket,(struct sockaddr *)&from,&fromlen);

   if (OrigSock == INVALID_SOCKET)  {
      fprintf(stderr,"accept failed %d\n",GetLastError());
      return -1;
   }
   {
      STARTUPINFO si;
      PROCESS_INFORMATION pi;
      char argbuf[256];

      memset(&si,0,sizeof(si));

      // 
      // Duplicate the socket OrigSock to create an inheritable copy.
      // 
      if (!DuplicateHandle(GetCurrentProcess(),
            (HANDLE)OrigSock,
            GetCurrentProcess(),
            (HANDLE*)&DuplicateSock,
            0,
            TRUE, // Inheritable
            DUPLICATE_SAME_ACCESS)) {

         fprintf(stderr,"dup error %d\n",GetLastError());
         return -1;
      }
      // 
      // Spawn the child process.
      // The first command line argument (argv[1]) is the socket handle.
      // 

      wsprintf(argbuf,"child.exe %d",DuplicateSock);
      if (!CreateProcess(NULL,argbuf,NULL,NULL,
               TRUE, // inherit handles
               0,NULL,NULL,&si,&pi) ){
         fprintf(stderr,"createprocess failed %d\n",GetLastError());
         return -1;
      }

      // 
      // On Windows 95, the parent needs to wait until the child
      // is done with the duplicated handle before closing it.
      // 
      WaitForSingleObject(pi.hProcess, INFINITE);
   }
   // 

   // The duplicated socket handle must be closed by the owner
   // process--the parent. Otherwise, socket handle leakage
   // occurs. On the other hand, closing the handle prematurely
   // would make the duplicated handle invalid in the child. In this
   // sample, we use WaitForSingleObject(pi.hProcess, INFINITE) to
   // wait for the child.
   // 
   closesocket(OrigSock);
   closesocket(DuplicateSock);
				
Aşağıdaki örnek kod, yeni oluşturulan işlem yuva tanıtıcısı, bir komut satırından nasıl ayıklayan göstermektedir:
   main(int argc, char *argv[]){
      SOCKET Sock;

      /* WSAStartup etc. */ 
      if (2 == argc){
         Sock = atoi(argv[1]);   // use Sock
      }
   }
				

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Platform Software Development Kit - Ocak 2000 Sürümü, Ne zaman ne ile kullanilir:
    • Microsoft Windows NT 3.51 Service Pack 5
    • Microsoft Windows NT 4.0
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • the operating system: Microsoft Windows 2000
Anahtar Kelimeler: 
kbmt kbapi kbbug kbnetwork kbwinsock KB150523 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:150523  (http://support.microsoft.com/kb/150523/en-us/ )