10 changed files with 217 additions and 7 deletions
-
3.vscode/settings.json
-
6CMakeLists.txt
-
2libxsync
-
33mainwindow.cpp
-
27mainwindow.h
-
5src/main.cpp
-
77src/xsync_udp_factory_impl.cpp
-
26src/xsync_udp_factory_impl.hpp
-
12src/zqthread.cpp
-
33src/zqthread.hpp
@ -1 +1 @@ |
|||
Subproject commit 362cd3a9013bfbee034a508bd7b36f819ce28ced |
|||
Subproject commit 5e99b7c334eae1657ea128754db0d5cd04849c7d |
@ -0,0 +1,77 @@ |
|||
#include "xsync_udp_factory_impl.hpp"
|
|||
|
|||
#include <winsock2.h>
|
|||
//
|
|||
#include <Windows.h>
|
|||
#pragma comment(lib, "ws2_32")
|
|||
using namespace iflytop; |
|||
class XSUDP : public I_XSUDP { |
|||
uint32_t m_ip; |
|||
int m_localport; |
|||
|
|||
struct sockaddr_in localadd = {}; |
|||
int m_sock_fd = 0; |
|||
|
|||
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; |
|||
}; |
|||
|
|||
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()); |
|||
localadd.sin_port = htons(localport); |
|||
|
|||
// 创建客户端用于通信的Socket
|
|||
m_sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); |
|||
if (m_sock_fd < 0) return kxs_ec_socket_fail; |
|||
|
|||
int ret = bind(m_sock_fd, (struct sockaddr*)&localadd, sizeof(localadd)); |
|||
if (ret < 0) return kxs_ec_bind_fail; |
|||
return kxs_ec_success; |
|||
} |
|||
|
|||
xs_error_code_t XSUDP::sendto(const XsyncNetAdd& to, const char* data, int32_t length) { |
|||
struct sockaddr_in sockaddr; |
|||
sockaddr.sin_family = AF_INET; |
|||
sockaddr.sin_addr.s_addr = htonl(to.ip); |
|||
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; |
|||
} |
|||
xs_error_code_t XSUDP::receive(const char* data, int32_t length, XsyncNetAdd& from, int overtimems) { |
|||
struct sockaddr_in sockaddr; |
|||
|
|||
timeval timeout; |
|||
timeout.tv_sec = overtimems; |
|||
timeout.tv_usec = 0; |
|||
if (setsockopt(m_sock_fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout)) == -1) { |
|||
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; |
|||
return kxs_ec_success; |
|||
} |
|||
|
|||
/*******************************************************************************
|
|||
* xSyncUdpFactoryImpl * |
|||
*******************************************************************************/ |
|||
|
|||
void XSyncUdpFactoryImpl::initialize() { |
|||
static bool isInit = false; |
|||
if (!isInit) { |
|||
WSADATA wsaData; |
|||
WSAStartup(MAKEWORD(2, 2), &wsaData); |
|||
isInit = true; |
|||
} |
|||
} |
|||
|
|||
shared_ptr<I_XSUDPListener> XSyncUdpFactoryImpl::createXSUDPListener() { return nullptr; } |
|||
shared_ptr<I_XSUDP> XSyncUdpFactoryImpl::createXSUDP() { return make_shared<XSUDP>(); } |
@ -0,0 +1,26 @@ |
|||
#pragma once
|
|||
#include <fstream>
|
|||
#include <functional>
|
|||
#include <iostream>
|
|||
#include <list>
|
|||
#include <map>
|
|||
#include <memory>
|
|||
#include <set>
|
|||
#include <sstream>
|
|||
#include <string>
|
|||
#include <vector>
|
|||
|
|||
#include "libxsync\xsync.hpp"
|
|||
namespace iflytop { |
|||
using namespace std; |
|||
|
|||
class XSyncUdpFactoryImpl : public I_XSyncUDPFactory { |
|||
private: |
|||
/* data */ |
|||
public: |
|||
void initialize(); |
|||
virtual shared_ptr<I_XSUDPListener> createXSUDPListener() override; |
|||
virtual shared_ptr<I_XSUDP> createXSUDP() override; |
|||
}; |
|||
|
|||
} // namespace iflytop
|
@ -0,0 +1,12 @@ |
|||
#include "zqthread.hpp"
|
|||
using namespace iflytop; |
|||
using namespace std; |
|||
|
|||
ZQThread::ZQThread(const char* name, function<void()> cb) { |
|||
name_ = QString(name); |
|||
cb_ = cb; |
|||
} |
|||
|
|||
void ZQThread::run() { |
|||
if (cb_) cb_(); |
|||
} |
@ -0,0 +1,33 @@ |
|||
#pragma once
|
|||
#include <fstream>
|
|||
#include <functional>
|
|||
#include <iostream>
|
|||
#include <list>
|
|||
#include <map>
|
|||
#include <memory>
|
|||
#include <set>
|
|||
#include <sstream>
|
|||
#include <string>
|
|||
#include <vector>
|
|||
|
|||
//
|
|||
#include <QString>
|
|||
#include <QThread>
|
|||
|
|||
namespace iflytop { |
|||
using namespace std; |
|||
|
|||
class ZQThread : public QThread { |
|||
Q_OBJECT |
|||
private: |
|||
QString name_; |
|||
function<void()> cb_; |
|||
|
|||
public: |
|||
ZQThread(const char* name, function<void()> cb); |
|||
|
|||
protected: |
|||
virtual void run() override; |
|||
}; |
|||
|
|||
} // namespace iflytop
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue