SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: diego.martinez en Miércoles 24 de Marzo de 2010, 20:32

Título: Abrir puerto en NON-BLOCKING
Publicado por: diego.martinez en Miércoles 24 de Marzo de 2010, 20:32
buenas:

hasta la fecha he programado servidores que abrian un puerto y escuchaban en tcp, pero siempre los hice bloqueantes.
En UDP, sin embargo, tengo el servidor como no-bloqueante, y todo va bien.

Sin embargo, estoy teniendo problemas para abrir un puerto tcp en no-bloqueante.

No entiendo muy bien.
Si despues de preparar el socket, hacerlo nobloqueante, hacer el listen y luego el accept; cuando el accept me devuelve WSA_WOULDBLOCK, que debo hacer para aceptar la conexion? Incluso lo he puesto en un bucle para recibir, pero no consigo entrar en el socket.

Código: C++
  1.  
  2. int appTCP::Open()
  3. {
  4. //-------- preparo el socket
  5.   sockaddr_in service;
  6.   ZeroMemory(&service,sizeof(service));
  7.   service.sin_family = AF_INET;
  8.   service.sin_addr.s_addr = htonl(INADDR_ANY);
  9.   service.sin_port = htons(Port);
  10.  
  11.     //creamos un socket para TCP
  12.     this->Socket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  13.     if (this->Socket==SOCKET_ERROR) return 1;
  14.  
  15.     //limpiamos nuestra address para hacer de host
  16.     memset((void *)&Host, '', sizeof(struct sockaddr_in));
  17.    
  18. //tomo los datos del host
  19.     /* Set family and port */
  20.     Host.sin_family = AF_INET;
  21.     Host.sin_port = htons(Port);
  22.  
  23.     /* Get host name of this computer */
  24.         gethostname(host_name, sizeof(host_name));
  25.         HostProperties = gethostbyname(host_name); //cojemos el nombre de la maquina local
  26.  
  27.         /* Check for NULL pointer */
  28.         if (HostProperties == NULL)
  29.             return 1;
  30.  
  31.         /* Assign the address */
  32.         Host.sin_addr.S_un.S_un_b.s_b1 = HostProperties->h_addr_list[0][0];
  33.         Host.sin_addr.S_un.S_un_b.s_b2 = HostProperties->h_addr_list[0][1];
  34.         Host.sin_addr.S_un.S_un_b.s_b3 = HostProperties->h_addr_list[0][2];
  35.         Host.sin_addr.S_un.S_un_b.s_b4 = HostProperties->h_addr_list[0][3];
  36.  
  37.         /*tenemos la ip , hagamosla string*/
  38. sprintf(StringIP,"%d.%d.%d.%d",Host.sin_addr.S_un.S_un_b.s_b1,Host.sin_addr.S_un.S_un_b.s_b2,Host.sin_addr.S_un.S_un_b.s_b3,Host.sin_addr.S_un.S_un_b.s_b4);
  39.        
  40.         TimeOut.tv_usec = msTimeout%1000;
  41.         TimeOut.tv_sec = msTimeout/1000;  // Time in seconds
  42.  
  43.  
  44.         u_long iMode = 1;
  45.         ioctlsocket (Socket, FIONBIO, &iMode);
  46.         err=WSAGetLastError(); 
  47.  
  48.         FD_ZERO (&fdSocket);
  49.         FD_SET  (Socket, &fdSocket); //ponemos el socket en vigilancia
  50.  
  51.         bind(Socket,(struct sockaddr *)&Host,sizeof(sockaddr));
  52.  
  53.         listen(Socket,SOMAXCONN);
  54.         unsigned int i=0;
  55.         err=WSAGetLastError(); 
  56.        
  57.         sockaddr Incoming;
  58.         int size=sizeof(Incoming);
  59.        
  60.         do
  61.         {
  62.             err=0;
  63.             SOCKET r=accept(Socket,&Incoming,&size);
  64.             if (r==-1)
  65.             err=WSAGetLastError();
  66.  
  67.         }while (err==WSAEWOULDBLOCK);
  68.            
  69. return 0;
  70. }
  71.  
  72.