He intentado este codigo con un servidor mio. Me parece funcionar, incluso sin O_NONBLOCK :
Código:
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <errno.h>
#include <arpa/inet.h>
#include <fcntl.h>
int main()
{
int puerto = 1025;
char *ip = "127.0.0.1";
struct sockaddr_in tcppeer;
int tcp_socket;
tcppeer.sin_family = AF_INET;
tcppeer.sin_port = htons(puerto);
tcppeer.sin_addr.s_addr = inet_addr(ip);
tcp_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (tcp_socket > 0)
{
printf("opened succesfully\n");
}
else
{
fprintf(stderr, " opening error : %d \n", errno);
}
if (connect(tcp_socket, (struct sockaddr*)&tcppeer, sizeof(tcppeer)))
{
shutdown(tcp_socket, SHUT_RDWR);
fprintf(stderr, "Unable to connect server :host %s: %u, error: %d \n", ip, puerto, errno);
}
}
Si el servidor esta conectado hay "opened succesfully" escrito,
y si no esta conectado hay inmediato : "Unable to connect server :host 127.0.0.1: 1025, error: 107" escrito en la pantalla (107 porque errno 107 es "ENOTCONN").
Pienso que el problema de tiempo es dentro la funcion "closesocket()" o "WSAGetLastError()". ¿ Que son sus implementaciónes ? ¿Podrias intentar eso y decir que se pasa ? :
Código:
if (connect(tcp_socket, (struct sockaddr*)&tcppeer, sizeof(tcppeer)))
{
fprint(stderr, "punto uno\n");
closesocket(tcp_socket);
sprintf(temp, "Unable to connect server :host %s: %u, error: %u \n", ip, puerto, WSAGetLastError());
fprint(stderr, "punto dos");
WriteDebug("a", temp);
rt = off;
}