diff --git a/libxsync b/libxsync index 5e99b7c..33e27f5 160000 --- a/libxsync +++ b/libxsync @@ -1 +1 @@ -Subproject commit 5e99b7c334eae1657ea128754db0d5cd04849c7d +Subproject commit 33e27f52d366381c5ef5647020a36b7cb2c5b190 diff --git a/mainwindow.cpp b/mainwindow.cpp index c302ac1..67a11d0 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -4,6 +4,7 @@ #include "./ui_mainwindow.h" #include "src/logger.hpp" +#include "src/xsync_udp_factory_impl.hpp" using namespace iflytop; using namespace std; @@ -17,9 +18,7 @@ void MainWindow::log_output(QtMsgType type, const QMessageLogContext &context, c m_mainWindow->append_log_signal(text); } -void MainWindow::append_log_slot(QString text) { - ui->logbrowser->append(text); -} +void MainWindow::append_log_slot(QString text) { ui->logbrowser->append(text); } void MainWindow::push_reg(QWidget *parent, int off, const char *regname, int32_t regadd, int32_t rwflag) { DispalyRegIterm *regitem = new DispalyRegIterm(); @@ -104,16 +103,39 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi connect(this, SIGNAL(append_log_signal(QString)), this, SLOT(append_log_slot(QString))); qInstallMessageHandler(log_output); - m_thread.reset(new ZQThread("test", [this]() { - while (true) { - ZLOGI(TAG, "start1"); - ZLOGI(TAG, "start2"); - ZLOGI(TAG, "start3"); - ZLOGI(TAG, "start4"); - QThread::sleep(1); - } - })); + m_thread.reset(new ZQThread("test", [this]() { mainWindowsRun(); })); m_thread->start(); } MainWindow::~MainWindow() { delete ui; } + +#define XS_ASSERT(exptr) \ + { \ + auto ecode = exptr; \ + while (!(ecode == kxs_ec_success)) { \ + ZLOGE(TAG, "do: %s fail,ecode:%d", #exptr, ecode); \ + ZQThread::sleep(1); \ + } \ + } + +void MainWindow::mainWindowsRun() { // + XSyncUdpFactoryImpl::Ins()->initialize(); + auto xsudp = XSyncUdpFactoryImpl::Ins()->createXSUDP(); + + XS_ASSERT(xsudp->initialize("0.0.0.0", 9999)); + + while (true) { + XS_ASSERT(xsudp->sendto(XsyncNetAdd("127.0.0.1", 9973), "hello\n", 5, NULL)); + ZQThread::sleep(1); + + XsyncNetAdd from; + char rxcache[1024] = {0}; + int rxlength = 1024; + auto ecode = xsudp->receive(rxcache, rxlength, from, 5000); + if (ecode == kxs_ec_success) { + ZLOGI(TAG, "receive from %s:%d %s(%d)", from.ip.c_str(), from.port, rxcache, rxlength); + } else { + ZLOGE(TAG, "receive fail,ecode:%d,%d", ecode, rxlength); + } + } +} diff --git a/mainwindow.h b/mainwindow.h index 0215040..77e9b70 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -66,8 +66,13 @@ class MainWindow : public QMainWindow { *******************************************************************************/ static void log_output(QtMsgType type, const QMessageLogContext &context, const QString &msg); private slots: - void append_log_slot(QString ); + void append_log_slot(QString); signals: void append_log_signal(QString str); + + private: + + void mainWindowsRun(); + }; #endif // MAINWINDOW_H diff --git a/src/logger.hpp b/src/logger.hpp index 5de2d80..84bff8c 100644 --- a/src/logger.hpp +++ b/src/logger.hpp @@ -9,3 +9,8 @@ int32_t zos_get_ticket(); #define ZLOGD(TAG, fmt, ...) zos_log("%08lu DEBU [%-10s] " fmt "", zos_get_ticket(), TAG, ##__VA_ARGS__); #define ZLOGE(TAG, fmt, ...) zos_log("%08lu ERRO [%-10s] " fmt "", zos_get_ticket(), TAG, ##__VA_ARGS__); #define ZLOGW(TAG, fmt, ...) zos_log("%08lu WARN [%-10s] " fmt "", zos_get_ticket(), TAG, ##__VA_ARGS__); +#define ZASSERT(cond) \ + if (!(cond)) { \ + ZLOGE("ASSERT", "condition: %s", #cond); \ + exit(-1); \ + } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index fcd9a6f..8aa745f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,12 +20,19 @@ #include "logger.hpp" #include "mainwindow.h" - +// +#include +// +#include +// #define TAG "Main" using namespace std; QT_CHARTS_USE_NAMESPACE int main(int argc, char *argv[]) { + WSADATA wsaData; + WSAStartup(MAKEWORD(2, 2), &wsaData); + QApplication a(argc, argv); MainWindow w; w.show(); diff --git a/src/xsync_udp_factory_impl.cpp b/src/xsync_udp_factory_impl.cpp index 70eec6b..96c76d3 100644 --- a/src/xsync_udp_factory_impl.cpp +++ b/src/xsync_udp_factory_impl.cpp @@ -14,10 +14,16 @@ class XSUDP : public I_XSUDP { public: virtual xs_error_code_t initialize(string ip, int localport) override; - virtual xs_error_code_t sendto(const XsyncNetAdd& to, const char* data, int32_t length) override; - virtual xs_error_code_t receive(const char* data, int32_t length, XsyncNetAdd& from, int overtimems) override; + virtual xs_error_code_t sendto(const XsyncNetAdd& to, const char* data, int32_t length, int32_t* sendlength) override; + virtual xs_error_code_t receive(char* data, int32_t& length, XsyncNetAdd& from, int overtimems) override; }; +const char* fmtip(uint32_t ip) { + static char ipstr[16]; + sprintf(ipstr, "%d.%d.%d.%d", (ip >> 24) & 0xff, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff); + return ipstr; +} + xs_error_code_t XSUDP::initialize(string ip, int localport) { localadd.sin_family = AF_INET; localadd.sin_addr.s_addr = inet_addr(ip.c_str()); @@ -32,17 +38,20 @@ xs_error_code_t XSUDP::initialize(string ip, int localport) { return kxs_ec_success; } -xs_error_code_t XSUDP::sendto(const XsyncNetAdd& to, const char* data, int32_t length) { +xs_error_code_t XSUDP::sendto(const XsyncNetAdd& to, const char* data, int32_t length, int32_t* sendlength) { struct sockaddr_in sockaddr; sockaddr.sin_family = AF_INET; - sockaddr.sin_addr.s_addr = htonl(to.ip); + sockaddr.sin_addr.s_addr = inet_addr(to.ip.c_str()); sockaddr.sin_port = htons(to.port); int ret = ::sendto(m_sock_fd, data, length, 0, (struct sockaddr*)&sockaddr, sizeof(sockaddr)); - if (ret != length) return kxs_ec_send_fail; - return kxs_ec_success; + if (sendlength) *sendlength = ret; + if (ret >= 0) { + return kxs_ec_success; + } + return kxs_ec_send_fail; } -xs_error_code_t XSUDP::receive(const char* data, int32_t length, XsyncNetAdd& from, int overtimems) { - struct sockaddr_in sockaddr; +xs_error_code_t XSUDP::receive(char* data, int32_t& length, XsyncNetAdd& from, int overtimems) { + struct sockaddr_in sockaddr = {0}; timeval timeout; timeout.tv_sec = overtimems; @@ -51,12 +60,25 @@ xs_error_code_t XSUDP::receive(const char* data, int32_t length, XsyncNetAdd& fr return kxs_ec_setsockopt_rx_timeout_fail; } - sockaddr.sin_family = AF_INET; - sockaddr.sin_addr.s_addr = htonl(from.ip); - sockaddr.sin_port = htons(from.port); - int senderAddressLen = sizeof(sockaddr); - int ret = ::recvfrom(m_sock_fd, (char*)data, length, 0, (struct sockaddr*)&sockaddr, &senderAddressLen); - if (ret != length) return kxs_ec_receive_fail; + // sockaddr.sin_family = AF_INET; + // sockaddr.sin_addr.s_addr = inet_addr(from.ip.c_str()); + // sockaddr.sin_port = htons(from.port); + int senderAddressLen = sizeof(sockaddr); + int ret = ::recvfrom(m_sock_fd, (char*)data, length, 0, (struct sockaddr*)&sockaddr, &senderAddressLen); + length = ret; + if (ret < 0) { + if (errno == EWOULDBLOCK || errno == EAGAIN) { + return kxs_ec_overtime; + } else { + return kxs_ec_receive_fail; + } + } + + // inet_ntop(AF_INET, &(sockaddr.sin_addr), ip, INET_ADDRSTRLEN); + uint32_t ip = ntohl(sockaddr.sin_addr.s_addr); + from.ip = string(fmtip(ip)); + from.port = ntohs(sockaddr.sin_port); + return kxs_ec_success; } @@ -64,13 +86,11 @@ xs_error_code_t XSUDP::receive(const char* data, int32_t length, XsyncNetAdd& fr * xSyncUdpFactoryImpl * *******************************************************************************/ -void XSyncUdpFactoryImpl::initialize() { - static bool isInit = false; - if (!isInit) { - WSADATA wsaData; - WSAStartup(MAKEWORD(2, 2), &wsaData); - isInit = true; - } +void XSyncUdpFactoryImpl::initialize() {} + +XSyncUdpFactoryImpl* XSyncUdpFactoryImpl::Ins() { + static XSyncUdpFactoryImpl instance; + return &instance; } shared_ptr XSyncUdpFactoryImpl::createXSUDPListener() { return nullptr; } diff --git a/src/xsync_udp_factory_impl.hpp b/src/xsync_udp_factory_impl.hpp index c523b29..41a11c3 100644 --- a/src/xsync_udp_factory_impl.hpp +++ b/src/xsync_udp_factory_impl.hpp @@ -17,7 +17,11 @@ using namespace std; class XSyncUdpFactoryImpl : public I_XSyncUDPFactory { private: /* data */ + XSyncUdpFactoryImpl(){}; + public: + static XSyncUdpFactoryImpl* Ins(); + void initialize(); virtual shared_ptr createXSUDPListener() override; virtual shared_ptr createXSUDP() override;