connect(sock[i], (struct sockaddr *) &addr, sizeof (addr)); if (WSAGetLastError() == WSAEINPROGRESS) { closesocket (sock[i]); iBusySocks--; } else { busy[i] = 1; port[i] = iStartPort; } iStartPort++; } } FD_ZERO (&fdWaitSet); for (int i = 0; i < MAX_SOCKETS; i++) { if (busy[i] == 1) FD_SET (sock[i], &fdWaitSet); }
struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0;
if (select (1, NULL, &fdWaitSet, NULL, &tv) == SOCKET_ERROR) { SetDlgItemText(IDC_STATUSTEXT, "Select error"); return; }
for (int i = 0; i < MAX_SOCKETS; i++) { if (busy[i] == 1) { if (FD_ISSET (sock[i], &fdWaitSet)) { int opt; int Len = sizeof(opt); if (getsockopt(sock[i], SOL_SOCKET, SO_ERROR, (char*)&opt, &Len) == SOCKET_ERROR) SetDlgItemText(IDC_STATUSTEXT, "getsockopt error");
if (opt == 0) { struct servent *tec; itoa(port[i],tStr, 10); strcat(tStr, " ("); tec = getservbyport(htons (port[i]), "tcp"); if (tec==NULL) strcat(tStr, "Unknown"); else strcat(tStr, tec->s_name);
strcat(tStr, ") - open"); m_PortList.AddString(tStr); busy[i] = 0; shutdown(sock[i], SD_BOTH); closesocket(sock[i]); } busy[i] = 0; shutdown (sock[i], SD_BOTH); closesocket (sock[i]); iBusySocks--; } else { busy[i] = 0; closesocket(sock[i]); iBusySocks--; } } } ProcessMessages(); } WSACleanup(); SetDlgItemText(IDC_STATUSTEXT, "Scaning complete"); return; }
В данном примере для сканирования используются три массива:
В этом примере есть одна новая функция, которую мы не рассматривали, — getservbyport. Она выглядит следующим образом: