Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

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

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

Ответ
 
Опции темы
Старый 09.05.2018, 15:59   #1
kook163
Новичок
 
Регистрация: 09.05.2018
Сообщений: 3
Репутация: 10
По умолчанию QUdpSocket работает только при локальном IP. Не работает если указан динамичесский айпи

Создаю чат Udp. Приложение имеет вид криента. Сокет биндит порт и может как отправлять так и получать сообщения. При локальном айпи 127.0.0.1 все хорошо работает. Запускаю несколько программ коннекчусь и они отправляют и принимают датаграммы. А придинамичесском айпи почему то не работает. Класс UdpSock вынес в другой поток.
UdpSock.cpp
Код:

#include "udpsock.h"
#include "QMessageBox"
#include "messegestruct.h"
#include "usercontroller.h"
#include <QHostAddress>
#include <mainwindow.h>
#include <user.h>
 
 
 UdpSock::UdpSock()
{
   socket =new QUdpSocket(this);
   connect(socket,SIGNAL(readyRead()),this,SLOT(readDate()));
   connect(this,SIGNAL(connectToUserSignal(QHostAddress, quint16)),this,SLOT(connectToUser(QHostAddress, quint16)));
   connect(this,SIGNAL(bindPortSignal(QString,quint16)),this,SLOT(bindPort(QString,quint16)));
   connect(this,SIGNAL(sendSignal(MessegeStruct*)),this,SLOT(send(MessegeStruct*)));
}
 
UdpSock::~UdpSock()
{
    delete socket;
    emit finished();
}
 
bool UdpSock::bindPort(QString nickname,quint16 bindPort)
{
     this->nickname=nickname;
     this->port=bindPort;
     bool bind=socket->bind(QHostAddress::AnyIPv4, bindPort);
     if(bind){
 
     }
     return bind;
}
void UdpSock::send(MessegeStruct *ms)
{
    socket->writeDatagram(ms->getCodeMess(),ms->getIpAdress(),ms->getPort());
    //delete ms;
}
void UdpSock::readDate()
{
    while (socket->hasPendingDatagrams())
    {
        QByteArray datagram;
        QHostAddress ip;
        quint16 Port;
        datagram.resize(socket->pendingDatagramSize());
        socket->readDatagram(datagram.data(), datagram.size(),&ip, &Port);
        MessegeStruct *ms=new MessegeStruct(datagram,ip,Port);
        emit receives_data_signal(ms);
       // delete ms;
    }
}
void UdpSock::connectToUser(QHostAddress reedIpAdress, quint16 Port)
{
    MessegeStruct *mesStr = new MessegeStruct(reedIpAdress,Port,nickname,MessegeStruct::connectMessege,"Сообщение");
    send(mesStr);
 
}

MainWindow.cpp Работа с потоками
Код:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
        qRegisterMetaType<QHostAddress>("QHostAddress");
        QThread *thread=new QThread();
        udpSock = new UdpSock();
        udpSock->moveToThread(thread);
        usercontr=new UserController(udpSock);
        connect(usercontr,SIGNAL(user_connected_signal(User*)),this,SLOT(addTAbWidget(User*)));
        connect(udpSock, SIGNAL(finished()), thread, SLOT(quit()));
        connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
        thread->start();
 
}

kook163 вне форума   Ответить с цитированием
Старый 09.05.2018, 16:49   #2
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,582
Репутация: 1780
По умолчанию

Динамическое IP или нет значения не имеет, а вот публичный адрес или приватный - запросто.

Ref:
https://en.wikipedia.org/wiki/Private_network
waleri на форуме   Ответить с цитированием
Старый 09.05.2018, 16:58   #3
kook163
Новичок
 
Регистрация: 09.05.2018
Сообщений: 3
Репутация: 10
По умолчанию

Имел в ввиду публичный ip адрес
kook163 вне форума   Ответить с цитированием
Старый 09.05.2018, 18:03   #4
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,582
Репутация: 1780
По умолчанию

Цитата:
Сообщение от kook163 Посмотреть сообщение
Имел в ввиду публичный ip адрес
Firewall отключен/настроен?
Подключение к сети напрямую или через рутер?
waleri на форуме   Ответить с цитированием
Старый 09.05.2018, 19:57   #5
kook163
Новичок
 
Регистрация: 09.05.2018
Сообщений: 3
Репутация: 10
По умолчанию

Firewall отключен, подключен через роутер
kook163 вне форума   Ответить с цитированием
Старый 09.05.2018, 23:40   #6
Stanislav
Квадрокоптерист
ПрофессионалФорумчанин
 
Регистрация: 29.09.2007
Сообщений: 1,802
Репутация: 532
По умолчанию

Walery все верно написал, адрес может быть за Nat. Проверьте белый это айпи или серый.
__________________
Я часть той силы, что вечно хочет зла, но вечно совершает благо..
Stanislav вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SendMessage(BSend, BM_CLICK, 0, 0); работает только если курсор находится над кнопкой Armorer Win Api 10 19.10.2017 23:15
Программа на Visual C# работает при запуске руками, но не работает при попытки автоматического запуска Bug$ Помощь студентам 18 21.10.2013 16:22
Скрипт не работает, если линкую локально, а работает если линкую на .. keen_ JavaScript, Ajax 3 08.03.2012 07:58
Комментарии. Только при пин-коде. Почему работает только 1 пи код? Bushel PHP 1 23.10.2010 18:21
программа работает только при проходе F10 .... user1990 Общие вопросы C/C++ 4 14.10.2010 15:38


14:35.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru