Mam gniazdo blokujące (przynajmniej wydaje się więc w następujący kod):connect() zwraca "Operacja teraz w toku" na gnieździe blokującym?
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock < 0) {
ERROR("%s: error opening socket", __func__);
return (RESP_ERROR);
}
t.tv_sec = timeout;
t.tv_usec = 0;
int rf = fcntl(sock, F_GETFD);
ERROR("fcntl ret=%d, ret & O_NONBLOCK = %d", rf, rf & O_NONBLOCK);
if ((setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&t, sizeof (t)) < 0)
|| (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&t, sizeof (t)))) {
strerror_r(errno, err, 254);
ERROR("%s: error on setsockopt -> %s", __func__, err);
close(sock);
return (RESP_ERROR);
}
rf = fcntl(sock, F_GETFD);
ERROR("after select fcntl ret=%d, ret & O_NONBLOCK = %d", rf, rf & O_NONBLOCK);
if (connect(sock, (struct sockaddr *)&dst, sizeof (dst)) != 0) {
strerror_r(errno, err, 254);
ERROR("%s: error on connect -> %s", __func__, err);
close(sock);
return (RESP_ERROR);
}
A to z dziennika:
06 marca 10:42:04 TcpClient: fcntl ret = 0 RET & O_NONBLOCK = 0
06 marca 10:42:04 TcpClient: po wybraniu fcntl RET = 0 RET & O_NONBLOCK = 0
06 marca 10:42:14 TcpClient : authenticate: error on connect -> Działanie w toku
Wygląda na to, że jest to gniazdo blokujące, ale zwraca błąd typowy dla braku blokady? Linux to 2.6.18-308.el5. Jakieś pomysły?
'timeout' ma jaką wartość? – alk
Aby zweryfikować moją odpowiedź, chciałbym zrobić kilka testów. Dlatego chciałbym wiedzieć, jak 'dst' został zainicjowany przed przekazaniem go do' connect() '. Czy jesteś pewien, że jego członek 'sin_family' został poprawnie ustawiony? – alk