простой многопоточный сканер портов. при сканировании своей подсети
(netmask 255.255.240.0) примерно после 1000 хоста, начинается сабж. При сканировании других подсетей, все нормально работает. Вопрос подкупает своей новизной, "Кто виноват, и что делать?" Прошу помощи!
куски кода:
int isconnected( int s, fd_set *rd, fd_set *wr, fd_set * )
{
int err;
int len = sizeof( err );;
errno = 0;
if ( !FD_ISSET( s, rd ) && !FD_ISSET( s, wr ) ) return 0;
if ( getsockopt( s, SOL_SOCKET, SO_ERROR, &err, (socklen_t*)&len ) < 0 ) return 0;
errno = err;
return err == 0;
}
bool chkport( const char * ipaddress, int connect_timeout, int port_number )
{
bool pOpen = FALSE;
int Ms; //SOCKET
fd_set rdevents;
fd_set wrevents;
fd_set exevents;
struct sockaddr_in peer;
struct timeval tv;
int flags;
int rc;
bzero( &peer, sizeof( peer ) );
peer.sin_family = AF_INET;
peer.sin_port = htons( port_number );
peer.sin_addr.s_addr = inet_addr( ipaddress );
Ms = socket( AF_INET, SOCK_STREAM, 0 );
if ( !( Ms >= 0 ) )
{
cout <<"socket call failed";
return FALSE;
}
if( ( flags = fcntl( Ms, F_GETFL, 0 ) ) < 0 )
cout <<"fcntl (F_GETFL) failed";
if ( fcntl( Ms, F_SETFL, flags | O_NONBLOCK ) < 0 )
cout <<"fcntl (F_SETFL) failed";
rc = connect( Ms, ( struct sockaddr * )&peer, sizeof( peer ) );
if ( rc == -1 && errno != EINPROGRESS )
{
cout <<"connect return -1 errno = "<< errno;
pOpen = FALSE;
}
else if ( rc == 0 && errno != EINPROGRESS ) /* already connected? */
{
cout <<"connected quickly";
pOpen = TRUE;
}
else
{
FD_ZERO( &rdevents );
FD_SET( Ms, &rdevents );
wrevents = rdevents;
exevents = rdevents;
tv.tv_sec = 0;
tv.tv_usec = connect_timeout;
rc = select( Ms + 1, &rdevents, &wrevents, &exevents, &tv );
if ( rc < 0 )
{
cout <<"select failed";
}
else if ( rc == 0 )
{
cout <<"connect timed out";
}
else if ( isconnected( Ms, &rdevents, &wrevents, &exevents ) )
{
cout <<"connected 2";
pOpen = TRUE;
}
else cout <<"connect failed 2";
}
if ( fcntl( Ms, F_SETFL, flags ) < 0 )
cout <<"fcntl (F_SETFL) failed";
shutdown( Ms, SHUT_RDWR);
close(Ms);
return pOpen;
}
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от anonymous
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум покритикуйте следующий код(не мой) (2005)
- Форум Запись в неблокируемый udp сокет (2020)
- Форум сокет. получить данные (2007)
- Форум Таймаут для connect() (2009)
- Форум Непонятки с сокетами (2006)
- Форум Получение списка интерфейсов через netlink (2013)
- Форум Уничтожение дочернего процесса (2004)
- Форум Проблема с select (2002)
- Форум Проблема с сокетами (2011)
- Форум Чтение выхлопа процесса без ожидания его завершения (2019)