Здравствуйте, 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 привязывает событие сокета к оконному сообщению, а поток ждет какого-то левого не привязанного они к чему эвента.