Timeout для connect (Linux, C++)
Ради тренировки написал штуку, которая рассчитывает IP между двумя введенными, и проверяет возможность подключения к ним на определенном порту. Например так:
Код:
# proga 127.0.0.1 127.0.0.10 80
Код:
char * ipbuff[total];
Вот, что я сделал:
Код:
int main( ... ) {
...
int sock[total];
int conn[total];
struct sockaddr_in addr[total];
for ( int si = 0; si < total; si++)
{
sock[si] = socket(AF_INET, SOCK_STREAM, 0);
if ( sock[si] < 0 ) {
perror("socket");
exit(3);
}
memset(&addr[si], 0, sizeof(addr[si]));
addr[si].sin_family = AF_INET;
addr[si].sin_port = htons(n_connect_port);
addr[si].sin_addr.s_addr = inet_addr(ipbuff[si]);
conn[si] = connect(sock[si], (struct sockaddr *)&addr[si], sizeof(addr[si]));
if ( conn[si] < 0 ) {
cout << ipbuff[si] << ":" << n_connect_port << " ... Fail!" << endl;
} else {
cout << ipbuff[si] << ":" << n_connect_port << " ... Ok!" << endl;
}
close (sock[si]);
}
...
}
...
int sock[total];
int conn[total];
struct sockaddr_in addr[total];
for ( int si = 0; si < total; si++)
{
sock[si] = socket(AF_INET, SOCK_STREAM, 0);
if ( sock[si] < 0 ) {
perror("socket");
exit(3);
}
memset(&addr[si], 0, sizeof(addr[si]));
addr[si].sin_family = AF_INET;
addr[si].sin_port = htons(n_connect_port);
addr[si].sin_addr.s_addr = inet_addr(ipbuff[si]);
conn[si] = connect(sock[si], (struct sockaddr *)&addr[si], sizeof(addr[si]));
if ( conn[si] < 0 ) {
cout << ipbuff[si] << ":" << n_connect_port << " ... Fail!" << endl;
} else {
cout << ipbuff[si] << ":" << n_connect_port << " ... Ok!" << endl;
}
close (sock[si]);
}
...
}
Заранее благодарю!
Вообще, man connect. Там должно быть что-то про
Цитата:
EINPROGRESS
The socket is non-blocking and the connection cannot be completed immedi-
ately. It is possible to select(2) or poll(2) for completion by selecting
the socket for writing. After select(2) indicates writability, use getsock-
opt(2) to read the SO_ERROR option at level SOL_SOCKET to determine whether
connect() completed successfully (SO_ERROR is zero) or unsuccessfully
(SO_ERROR is one of the usual error codes listed here, explaining the reason
И почитать про неблокируемые сокеты хотя бы приблизительно, например, тут.
Думаю, этого хватит, если только про таймер ещё почитать, например, тут, ну или где попонятней будет.
Спасибо! В сторону таймера пока покопаю.