ID do artigo: 150523 - Última revisão: segunda-feira, 11 de julho de 2005 - Revisão: 3.3

Herança de soquete em plataformas diferentes 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 | Recolher tudo

Sintomas

Microsoft Windows 95 e Microsoft Windows 98 trate herança do Winsock soquete alças de maneira diferente que o Microsoft Windows NT e Microsoft Windows 2000 ao usar DuplicateHandle() . Este artigo resume as diferenças.

Observação Em Winsock 2 WSADuplicateSocket/WSASocket é a maneira recomendada para compartilhamento de soquetes em plataformas Windows.

Situação

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

A Microsoft está pesquisando esse problema e publicará mais informações neste artigo quando as informações se torna disponíveis.

Mais Informações

No Windows NT e Windows 2000, os identificadores de soquete são herdáveis por padrão. Esse recurso é geralmente usado por um processo que deseja gerar um processo filho e ter o processo filho interagir com o aplicativo remoto na outra extremidade da conexã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 filho para a alça de soquete. Em tais casos, o processo filho geralmente não sabe que suas alças padrão são realmente soquetes.

Windows 9 x difere do Windows NT/Windows 2000 da seguinte maneira:
  • Os identificadores de soquete não são herdáveis quando criado. Para garantir que um processo filho pode obter e usar um identificador soquete criado no pai, o identificador deve ser explicitamente duplicado usando o Win32 API DuplicateHandle. Defina o parâmetro bInheritHandle da API para TRUE.
  • Alças de soquete não podem ser definidas como as alças de padrão do processo filho. Um programador pode usar outros mecanismos para passar o identificador de soquete para o cliente, como passando os valores de identificador como argumentos de linha de comando para que o processo filho simplesmente pode examinar o vetor de argumento.

Código de exemplo

O código de exemplo a seguir ilustra como escrever aplicativos que herdarão soquetes em processos filho no Windows 9 x e Windows NT/Windows 2000.

Observação Isso é apenas o código de 32 bits; aplicativos de 16 bits não podem herdar alças de soquete.
   // 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 a seguir ilustra como o processo recém-criado extrai o identificador de soquete de sua linha de comando:
   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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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/ )