[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