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