Добрый день!
Столкнулся со следующей проблемой при программировании сокетов на 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.