Re: Не могу разобраться с грамотным закрытием Socket
От: Garrett Россия  
Дата: 22.03.07 07:52
Оценка:
Здравствуйте, Almair, Вы писали:

A>Код

Прежде всего надо его в рабочий вид привести. Сейчас вообще непонятно почему он работает.
A>
A>WSADATA wsaData;
A>  int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
A>  if (iResult != NO_ERROR){
A>  return 1;
A>  }
A>    SOCKET ConnectSocket;
A>    ConnectSocket = INVALID_SOCKET;
A>    sockaddr_in clientService; 
A>    ZeroMemory( &clientService, sizeof(clientService) );
    
A>    if(ip[0][0]!='\0') 
A>    {
A>        clientService.sin_family = AF_INET;
A>        clientService.sin_addr.s_addr = inet_addr( (const char *)ip[0] );
A>        clientService.sin_port = htons(DEFAULT_PORT);
A>    }else{
A>       WSACleanup();    
A>       return 1;
A>    }

A>        ConnectSocket = socket(PF_INET, SOCK_STREAM, 0);
A>        if (ConnectSocket == INVALID_SOCKET) {
A>            WSACleanup();
A>            return 1;
A>        }




A>        u_long block = 1;
A>        if (ioctlsocket(ConnectSocket, FIONBIO, &block) == SOCKET_ERROR){
A>            return 1;
A>        }


A>        fd_set writefds;
A>        FD_ZERO(&writefds);
A>        FD_SET(ConnectSocket, &writefds);

A>        WSAAsyncSelect(ConnectSocket,my->GetSafeHwnd(),WM_USER+1,FD_CONNECT);// что такое my и как оно обрабатывает это сообщение?  
A>        WSAEVENT hEvent = WSACreateEvent(); 
A>        int flag = 1; 
A>        setsockopt (ConnectSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&flag, sizeof (flag));        


    
A>        int rtt;
A>        rtt=connect(ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService));
A>        rtt=WSAGetLastError();
A>    while(1) 
A>    { 
A>        DWORD dwRet;
A>        if ((dwRet = WSAWaitForMultipleEvents(1, &hEvent, TRUE,500, TRUE)) == WSA_WAIT_FAILED){
A>        break;
A>        }

A>            if(dwRet == WSA_WAIT_TIMEOUT) 
A>            { 
A>            bad++;all++;
A>            WSAAsyncSelect( ConnectSocket, my->GetSafeHwnd(), 0, 0);
A>            break;
A>            } 
A>            WSANETWORKEVENTS events; 
A>            WSAEnumNetworkEvents(ConnectSocket, hEvent, &events); 

A>            if(events.lNetworkEvents & FD_CONNECT) 
A>            { 
A>            good++;all++;
A>            break;
A>            } 
A>    }

A>        shutdown(ConnectSocket, 2);
A>        closesocket(ConnectSocket);
A>        ConnectSocket=NULL;
A>        WSACleanup();
A>        WSACloseEvent(hEvent);
A>    return 0;
A>


WSAAsyncSelect привязывает событие сокета к оконному сообщению, а поток ждет какого-то левого не привязанного они к чему эвента.
в борьбе со здравым смыслом победа будет за нами!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.