Programación General > C/C++

 Abrir puerto en NON-BLOCKING

(1/1)

diego.martinez:
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++ --- int appTCP::Open(){//-------- preparo el socket  sockaddr_in service;  ZeroMemory(&service,sizeof(service));  service.sin_family = AF_INET;  service.sin_addr.s_addr = htonl(INADDR_ANY);  service.sin_port = htons(Port);     //creamos un socket para TCP    this->Socket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    if (this->Socket==SOCKET_ERROR) return 1;     //limpiamos nuestra address para hacer de host    memset((void *)&Host, '', sizeof(struct sockaddr_in));    //tomo los datos del host    /* Set family and port */    Host.sin_family = AF_INET;    Host.sin_port = htons(Port);     /* Get host name of this computer */        gethostname(host_name, sizeof(host_name));        HostProperties = gethostbyname(host_name); //cojemos el nombre de la maquina local         /* Check for NULL pointer */        if (HostProperties == NULL)            return 1;         /* Assign the address */        Host.sin_addr.S_un.S_un_b.s_b1 = HostProperties->h_addr_list[0][0];        Host.sin_addr.S_un.S_un_b.s_b2 = HostProperties->h_addr_list[0][1];        Host.sin_addr.S_un.S_un_b.s_b3 = HostProperties->h_addr_list[0][2];        Host.sin_addr.S_un.S_un_b.s_b4 = HostProperties->h_addr_list[0][3];         /*tenemos la ip , hagamosla string*/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);                TimeOut.tv_usec = msTimeout%1000;         TimeOut.tv_sec = msTimeout/1000;  // Time in seconds           u_long iMode = 1;        ioctlsocket (Socket, FIONBIO, &iMode);         err=WSAGetLastError();           FD_ZERO (&fdSocket);         FD_SET  (Socket, &fdSocket); //ponemos el socket en vigilancia         bind(Socket,(struct sockaddr *)&Host,sizeof(sockaddr));         listen(Socket,SOMAXCONN);        unsigned int i=0;        err=WSAGetLastError();                  sockaddr Incoming;        int size=sizeof(Incoming);                do        {            err=0;            SOCKET r=accept(Socket,&Incoming,&size);            if (r==-1)             err=WSAGetLastError();         }while (err==WSAEWOULDBLOCK);            return 0;}  

Navegación

[0] Índice de Mensajes

Ir a la versión completa