Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2018, 14:59   #1
kook163
Новичок
Джуниор
 
Регистрация: 09.05.2018
Сообщений: 3
По умолчанию 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, 15:49   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

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

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

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

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

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SendMessage(BSend, BM_CLICK, 0, 0); работает только если курсор находится над кнопкой Armorer Win Api 12 27.04.2021 10:40
Программа на 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