Artigo: 150523 - Última revisão: segunda-feira, 11 de Julho de 2005 - Revisão: 3.3

Herança de socket em diferentes plataformas do Windows

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sintomas

Microsoft Windows 95 e Microsoft Windows 98 tratar herança do Winsock socket processa de forma diferente do Microsoft Windows NT e Microsoft Windows 2000 quando utilizar DuplicateHandle() . Este artigo resume as diferenças.

Nota Em Winsock 2 WSADuplicateSocket/WSASocket é a forma recomendada para partilha de sockets em plataformas do Windows.

Ponto Da Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na secção "Aplica-se a".

A Microsoft está a investigar este problema e publicará mais informações neste artigo quando a informação fica disponível.

Mais Informação

No Windows NT e Windows 2000, alças de socket são herdáveis por predefinição. Esta funcionalidade é frequentemente utilizada por um processo que pretende para expandir um processo subordinado e o processo de subordinados interagir com a aplicação remota na outra extremidade da ligação.

Também é prática comum no Windows NT para definir o padrão alças (padrão de entrada, saída ou erro) do processo subordinado para o identificador de socket. Nesses casos, o processo de subordinados, normalmente, não sabe que as alças padrão são realmente sockets.

Windows 9 x difere do Windows NT/Windows 2000 da seguinte forma:
  • Alças de socket não são herdáveis quando criado. Para assegurar que um processo subordinado pode obter e utilizar um identificador de socket criado no principal, o identificador deve ser explicitamente duplicado utilizando DuplicateHandle a API do Win32. Defina o parâmetro bInheritHandle da API para TRUE.
  • Alças de socket não podem ser definidas como as alças padrão do processo subordinado. Um programador poderá utilizar outros mecanismos para passar o identificador de socket para o cliente, tal como transmitir os valores de identificador como argumentos de linha de comandos para que o processo subordinado simplesmente pode observar o vector de argumento.

Exemplo de código

O código de exemplo seguinte ilustra a escrever aplicações herdeiros sockets em processos subordinados em ambos os Windows 9 x e Windows NT/Windows 2000.

Nota Esta é apenas o código de 32 bits; aplicações de 16 bits não podem herdar alças de socket.
   // 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);
				
o código de exemplo seguinte ilustra como o processo recém-criado extrai o identificador de socket da respectiva linha de comandos:
   main(int argc, char *argv[]){
      SOCKET Sock;

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

A informação contida neste artigo aplica-se a:
  • Microsoft Platform Software Development Kit-January 2000 Edition nas seguintes plataformas
    • 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
Palavras-chave: 
kbmt kbapi kbbug kbnetwork kbwinsock KB150523 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 150523  (http://support.microsoft.com/kb/150523/en-us/ )