chr00me
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Ок. Вот код: Код: int iRet; struct sockaddr_in sDest; struct sockaddr_in sSrc; LPHOSTENT lpHost; DWORD dwElapsed; SOCKET sd_win; // наш сокет, через который будем производить пинг WORD wVersion; WSADATA wsaData; wVersion = MAKEWORD (2, 2); // указываем версию WinSock int wsaInitError = WSAStartup (wVersion, &wsaData); if (wsaInitError != 0) { qDebug() << "Error!!!"; exit(1); } else { // Если найден WinSock2, то создаем "сырой" сокет sd_win = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if (sd_win == SOCKET_ERROR) { qDebug() << "Error!!!" break; } | Далее задаю хост, который буду пинговать: Код: char *strHost; strHost = "192.168.0.201";//для примера lpHost = gethostbyname(strHost); if (lpHost == NULL) { qDebug() << "Host not found"; } // Адрес сокета sDest.sin_addr.s_addr=*((u_long FAR *)(lpHost->h_addr)); sDest.sin_family = AF_INET; sDest.sin_port = 0; | Формирую ICMP пакет и отправляю его: Код: static ECHOREQUEST echoReq; echoReq.icmp_HDR.Type = ICMP_ECHOREQ; //Тип пакета. В нашем случаем ICMP_ECHOREQ, который означает эхо-запрос ответа. При ответе этот параметр должен быть равен 0 echoReq.icmp_HDR.Code = 0; //Эхо-запросами не используется, поэтому равен 0 echoReq.icmp_HDR.ID = 0; // Идентификатор echoReq.icmp_HDR.Seq = 0; // Номер очереди echoReq.dwTime = GetTickCount(); FillMemory(echoReq.cData, 64, 80); //Заполняем поле "Данные" пакета, который отправляем, символом с кодом 80. Размер пакета - 64 байта. echoReq.icmp_HDR.Checksum = CheckSum((u_short *)&echoReq, sizeof(ECHOREQUEST));//проверка КС sendto(sd_win, (LPSTR)&echoReq, sizeof(ECHOREQUEST), 0, (LPSOCKADDR)&sDest, sizeof(SOCKADDR_IN)); | Далее готовлюсь к чтению: Код: struct timeval tVal; fd_set readfds; readfds.fd_count = 1; readfds.fd_array[0] = sd_win; tVal.tv_sec = 1; tVal.tv_usec =0; iRet = select(0, &readfds, NULL, NULL, &tVal); if (!iRet) { qDebug() << "Timeout"; } | Вот на этом этапе и возникает проблема. сокет sd_win не готов к чтению...собстно пример взят из книги "Программирование на C++ глазами хакера." Фленов М.Е., Глава 6.5 |