Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2011, 16:16   #1
chr00me
Новичок
Джуниор
 
Регистрация: 05.12.2011
Сообщений: 2
По умолчанию Сокет не готов к чтению(Winsock2)

Доброго времени суток форумчане. Пишу что-то наподобие ping-а,
в целях расширения кругозора. Использую Winsock2
Итак, объявляю сокет и необходимые переменные:

Код:
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(1,  &readfds, NULL, NULL, &tVal);
    qDebug() << iRet;
    if (!iRet)
    {
        qDebug() << "Timeout";
    }
Вот на этом этапе и возникает проблема. Дело в том, что функция select всегда возвращает 0, говоря о том, что сокет sd_win не готов к чтению...в чем может быть проблема?
chr00me вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по WinSock: "сокет=сокет." Ksardas13 C/C++ Сетевое программирование 2 27.11.2011 16:12
Проблема с winsock2 firerap Общие вопросы Delphi 1 25.06.2011 22:53
WinSock2 Leloush Работа с сетью в Delphi 6 15.06.2009 13:54
Где взять WinSock2? AngelOfDeath Компоненты Delphi 5 14.03.2009 16:18