Russian Qt Forum
Ноябрь 23, 2024, 11:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите, не могу разобраться  (Прочитано 3789 раз)
Livingston
Гость
« : Октябрь 23, 2009, 18:30 »

Добрый день!
Столкнулся со следующей проблемой при программировании сокетов на Linux. В классе создается сокет:
Код:
struct sockaddr_in addr_me;
struct sockaddr_in addr_to;

    addr_me.sin_family = AF_INET;
    addr_me.sin_port = ntohs(10050);
    addr_me.sin_addr.s_addr = ntohl(INADDR_LOOPBACK);

    addr_to.sin_family = AF_INET;
    addr_to.sin_port = ntohs(10051);
    addr_to.sin_addr.s_addr = ntohl(INADDR_LOOPBACK);


    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        perror("socket");
    }
    else
    {
     bind(sock, (struct sockaddr*)&addr_me, sizeof(addr_me));
//  fcntl(sock, F_SETFL, O_NONBLOCK);
     connect(sock, (struct sockaddr*)&addr_to, sizeof(addr_to));

Затем в другом классе запускается таймер, который вызывает функцию отправки строки
Код:
timer = new QTimer(this, "timer");
connect(timer, SIGNAL(timeout()), this, SLOT(slotSendData()));
timer->start(1000, FALSE);
---
void window::slotSendData()
{
    mNet.sendData(msg.data(), msg.length());
}
---
void net::sendData(const char *msg, int len)
{
    send(sock, msg, len, 0);
}
Так вот какая суть.. Улыбающийся Программа работает, все нормально, но вот при проверке tcpdump, наблюдается следующий интересный эффект. Пакет уходит в ДВА интервала таймера. Т.е. если таймер стоит на 1000, пакет уходит раз в две секунды, если на 3000, раз в шесть, etc. Пробовал ставить слот отправки на кнопку, оказалось - сокет срабатывает при повторном обращении к нему, т.е. нажимаю кнопку - пакет ушел, нажимаю второй - нет, третий - ушел, четвертый - нет etc. Думал может проблема в блокировании сокета, добавил fcntl(). Все равно все так и осталось. Помогите, всю голову сломал Грустный QT 3.3.8.
« Последнее редактирование: Октябрь 23, 2009, 20:11 от Livingston » Записан
BRE
Гость
« Ответ #1 : Октябрь 23, 2009, 19:37 »

А если увеличить размер msg скажем до 10Кб? Попробуй.
Записан
Livingston
Гость
« Ответ #2 : Октябрь 23, 2009, 19:42 »

А есть смысл? msg это макуимум 500 байт (XML-строка, QDomDocument.toString())
Записан
BRE
Гость
« Ответ #3 : Октябрь 23, 2009, 19:48 »

А есть смысл? msg это макуимум 500 байт (XML-строка, QDomDocument.toString())
Если не сложно, проверь.
Записан
Livingston
Гость
« Ответ #4 : Октябрь 23, 2009, 19:52 »

msg это QString. Разве можно в этом случае расширить область?..
Записан
Livingston
Гость
« Ответ #5 : Октябрь 23, 2009, 19:56 »

просто я не зна своим компом, нет возможности быстро проверить... Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 21.