Не могу разобраться с грамотным закрытием Socket
От: Almair  
Дата: 20.03.07 09:37
Оценка:
Помогите. Хочу создать сканер диапазона 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++' — Кодт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.