Russian Qt Forum

Qt => Работа с сетью => Тема начата: Livingston от Октября 23, 2009, 18:30



Название: Помогите, не могу разобраться
Отправлено: 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.


Название: Re: Помогите, не могу разобраться
Отправлено: BRE от Октября 23, 2009, 19:37
А если увеличить размер msg скажем до 10Кб? Попробуй.


Название: Re: Помогите, не могу разобраться
Отправлено: Livingston от Октября 23, 2009, 19:42
А есть смысл? msg это макуимум 500 байт (XML-строка, QDomDocument.toString())


Название: Re: Помогите, не могу разобраться
Отправлено: BRE от Октября 23, 2009, 19:48
А есть смысл? msg это макуимум 500 байт (XML-строка, QDomDocument.toString())
Если не сложно, проверь.


Название: Re: Помогите, не могу разобраться
Отправлено: Livingston от Октября 23, 2009, 19:52
msg это QString. Разве можно в этом случае расширить область?..


Название: Re: Помогите, не могу разобраться
Отправлено: Livingston от Октября 23, 2009, 19:56
просто я не зна своим компом, нет возможности быстро проверить... :)