setsockopt(iResult, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)); setsockopt(iResult, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv)); in loc de IResult trebuie sa pui conn, care este socketul tau. daca faci socketul non-blocking nu mai folosesti setsockopt, intrucat timeoutul il setezi cu select mai jos ti-am facut un exemplu, s-ar putea sa aiba erori, nu l-am testat. fd_set readme; int result, ret; char reply[10]; struct timeval timeout; timeout.tv_sec = 3; /* Cate secunde? */ timeout.tv_usec = 0; /* Daca nu setam aici e posibil sa avem belele. */ ioctlsocket(conn, FIONBIO, 1); /* setam non-blocking */ FD_ZERO(&readme); FD_SET(conn, &readme); result = connect(conn, (struct sockaddr*)(&server), sizeof(struct sockaddr_in)); if (result == -1) { if (errno == WSAEISCONN) /* pe win trebuie cu WSAGetLastError */ { result = select(conn + 1, &readme, NULL, NULL, &timeout); /* si aici if (result) daca result < 0 am esuat*/ if(result) ret = recv(conn, reply, 10, 0); /* incercam sa vedem daca primim 10 bytes*/ /* restul e can-can, ret o sa-ti returneze numarul de bytes, daca ret <= 0 am esuat */ } } else { result = select(conn + 1, &readme, NULL, NULL, &timeout); /* si aici if (result) daca result < 0 am esuat*/ if(result) ret = recv(conn, reply, 10, 0); /* incercam sa vedem daca primim 10 bytes*/ /* restul e can-can, ret o sa-ti returneze numarul de bytes, daca ret <= 0 am esuat */ } totodata, cand folosesti non-blocking, trebuie sa fii atent la errcode pe care ti-l returneaza conexiunea. Pe linux este EISCONN care sugereaza succes. pe windows este WSAEISCONN. samd. Sunt mai multe cazuri, ti-am dat doar un exemplu prin care trebuie sa faci error handling. chiar nu am windows la indemana si te ajut din amintiri. oricum, tinand cont de cunostintele tale cu sockets, iti recomand sa folosesti setsockopt si nu mai pune socketul in non-blocking ptr. ca nu este cazul. Asa ca iti propun modificarile astea: sterge astea, ti-am zis ori folosesti setsockopt ori non-blocking cu select. nu amandoua. iResult = ioctlsocket(conn, FIONBIO, &iMode); if (iResult != NO_ERROR) printf("ioctlsocket failed with error: %ld\n", iResult); aici asa trebuie: if (server.sin_addr.s_addr != -1) { bzero(&(server.sin_zero), 8); setsockopt(conn, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)); setsockopt(conn, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv)); error = connect(conn, (struct sockaddr *) &server, sizeof (struct sockaddr)); if (error) return conn; //succes else { wprintf(L"bind failed with error %u\n", WSAGetLastError()); closesocket(conn); WSACleanup(); return NULL; } } tu te conectezi de doua ori pe acelasi socket. un potential motiv pentru eroarea care-ti apare.