Помогите. Хочу создать сканер диапазона ip по одному порту конкретному. Работать он конечно работает. Вот какая беда.
После 300-500 IP начинает говорить что все ip отвечают на FD_CONNECT
netstat показывает кучу соединений с ожиданием FIN_WAIT_1
и все...
Как от этого глюка избавиться??? Зарание спасибо...
Привожу часть кода программы непосредственно соединения.
Все это в тредах, порядка 20 тредов, пробовал в одном, не помогает.
среда Visual Studio 2005 MFC
библиотеки
#include <winsock2.h>
#include <ws2tcpip.h>
Код
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR){
return 1;
}
SOCKET ConnectSocket;
ConnectSocket = INVALID_SOCKET;
sockaddr_in clientService;
ZeroMemory( &clientService, sizeof(clientService) );
if(ip[0][0]!='\0')
{
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( (const char *)ip[0] );
clientService.sin_port = htons(DEFAULT_PORT);
}else{
WSACleanup();
return 1;
}
ConnectSocket = socket(PF_INET, SOCK_STREAM, 0);
if (ConnectSocket == INVALID_SOCKET) {
WSACleanup();
return 1;
}
u_long block = 1;
if (ioctlsocket(ConnectSocket, FIONBIO, &block) == SOCKET_ERROR){
return 1;
}
fd_set writefds;
FD_ZERO(&writefds);
FD_SET(ConnectSocket, &writefds);
WSAAsyncSelect(ConnectSocket,my->GetSafeHwnd(),WM_USER+1,FD_CONNECT);
WSAEVENT hEvent = WSACreateEvent();
int flag = 1;
setsockopt (ConnectSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&flag, sizeof (flag));
int rtt;
rtt=connect(ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService));
rtt=WSAGetLastError();
while(1)
{
DWORD dwRet;
if ((dwRet = WSAWaitForMultipleEvents(1, &hEvent, TRUE,500, TRUE)) == WSA_WAIT_FAILED){
break;
}
if(dwRet == WSA_WAIT_TIMEOUT)
{
bad++;all++;
WSAAsyncSelect( ConnectSocket, my->GetSafeHwnd(), 0, 0);
break;
}
WSANETWORKEVENTS events;
WSAEnumNetworkEvents(ConnectSocket, hEvent, &events);
if(events.lNetworkEvents & FD_CONNECT)
{
good++;all++;
break;
}
}
shutdown(ConnectSocket, 2);
closesocket(ConnectSocket);
ConnectSocket=NULL;
WSACleanup();
WSACloseEvent(hEvent);
return 0;
20.03.07 15:11: Перенесено модератором из 'C/C++' — Кодт