[C con Clase] Puerto abierto

Programante programante en gmail.com
Mar Abr 21 21:29:17 CEST 2009


Gilberto Cuba Ricardo escribió:
> Gracias a todos, metiéndole fuerte, pude sacar algo que comparto con
> todos ustedes y tal vez aparecen sugerencias e incluso hasta
> corrección de errores.
>   

Un par de detalles:

> bool is_local_open_port(unsigned int port)
> {
>     sockaddr_in clientSrv;
> #ifdef _WIN32
>     WSADATA wsaData;
>     SOCKET sock;
>
>     if(WSAStartup(MAKEWORD(2, 2), &wsaData)) {
>         WSACleanup();
>   
WSACleanup() es el contrario de WSAStartup(). Si WSAStartup falló, no
debes hacer

WSACleanup.


>         return false;
>     }
> #else
>     int sock;
> #endif
>
>     sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
>     if(sock == INVALID_SOCKET) {
> #ifdef _WIN32
>         WSACleanup();
> #endif
>         return false;
>     }
>
>     clientSrv.sin_family = AF_INET;
>     clientSrv.sin_addr.s_addr = inet_addr("127.0.0.1"); // localhost
>     clientSrv.sin_port = htons(port);
>     memset(&(clientSrv.sin_zero), '\0', 8);
>
>     if(connect(sock, (sockaddr *) &clientSrv, sizeof(clientSrv))
>         != SOCKET_ERROR) {
> #ifdef _WIN32
>         closesocket(sock);
>         WSACleanup();
> #endif
>         return true;
>     } else
>         return false;
> }
>   

Si no es Windows tienes que seguir cerrando el socket. En la API de
Berkeley es close(sock) en vez de closesocket();
También deberías hacer el WSACleanup(); si falla el connect.






Más información sobre la lista de distribución Cconclase