Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > 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,476
Репутация: 1667
По умолчанию

Динамическое 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,476
Репутация: 1667
По умолчанию

Цитата:
Сообщение от 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,781
Репутация: 513
По умолчанию

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


19:48.


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

RusProfile.ru


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