From e8a27bb203fe2aff70390a5eca002d7438da9b0f Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期三, 22 十月 2025 14:24:34 +0800
Subject: [PATCH] Merge branch 'clh' into liuyang
---
SourceCode/Bond/DAQBridge/net/SocketComm.cpp | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 105 insertions(+), 0 deletions(-)
diff --git a/SourceCode/Bond/DAQBridge/net/SocketComm.cpp b/SourceCode/Bond/DAQBridge/net/SocketComm.cpp
new file mode 100644
index 0000000..43eac34
--- /dev/null
+++ b/SourceCode/Bond/DAQBridge/net/SocketComm.cpp
@@ -0,0 +1,105 @@
+#include "SocketComm.h"
+
+SocketComm::SocketComm() {
+ if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
+ std::cerr << "WSAStartup failed\n";
+ }
+}
+SocketComm::~SocketComm() {
+ closeSocket();
+ WSACleanup();
+}
+
+bool SocketComm::setNonBlocking(SOCKET s, bool nb) {
+ u_long mode = nb ? 1UL : 0UL;
+ return ioctlsocket(s, FIONBIO, &mode) == 0;
+}
+
+bool SocketComm::createClientSocket(const std::string& serverIP, uint16_t serverPort) {
+ sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (sock == INVALID_SOCKET) return false;
+
+ sockaddr_in addr{}; addr.sin_family = AF_INET; addr.sin_port = htons(serverPort);
+ if (InetPton(AF_INET, serverIP.c_str(), &addr.sin_addr) <= 0) return false;
+
+ if (connect(sock, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) {
+ std::cerr << "connect failed: " << WSAGetLastError() << "\n";
+ closesocket(sock); sock = INVALID_SOCKET; return false;
+ }
+ return true;
+}
+
+bool SocketComm::createServerSocket(uint16_t port) {
+ listenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (listenSock == INVALID_SOCKET) return false;
+
+ // 复用地址
+ BOOL yes = 1; setsockopt(listenSock, SOL_SOCKET, SO_REUSEADDR, (char*)&yes, sizeof(yes));
+
+ sockaddr_in addr{}; addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(port);
+ if (bind(listenSock, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) return false;
+ if (listen(listenSock, SOMAXCONN) == SOCKET_ERROR) return false;
+
+ // 非阻塞监听
+ setNonBlocking(listenSock, true);
+ std::cout << "Server listening on port " << port << "\n";
+ return true;
+}
+
+bool SocketComm::acceptOne(SOCKET& outClient, std::string& outIp, uint16_t& outPort) {
+ sockaddr_in caddr{}; int len = sizeof(caddr);
+ SOCKET cs = accept(listenSock, (sockaddr*)&caddr, &len);
+ if (cs == INVALID_SOCKET) {
+ int e = WSAGetLastError();
+ if (e == WSAEWOULDBLOCK) return false; // 当前没有新连接
+ std::cerr << "accept error: " << e << "\n"; return false;
+ }
+ setNonBlocking(cs, true);
+ char ipbuf[INET_ADDRSTRLEN]{};
+ InetNtop(AF_INET, &caddr.sin_addr, ipbuf, INET_ADDRSTRLEN);
+ outIp = ipbuf; outPort = ntohs(caddr.sin_port);
+ outClient = cs;
+ return true;
+}
+
+bool SocketComm::recvFrom(SOCKET s, std::vector<uint8_t>& buffer, bool& peerClosed) {
+ peerClosed = false;
+ char tmp[4096];
+ int r = recv(s, tmp, sizeof(tmp), 0);
+ if (r > 0) {
+ buffer.assign(tmp, tmp + r);
+ return true;
+ }
+ if (r == 0) { // 对端正常关闭
+ peerClosed = true;
+ return false;
+ }
+ int e = WSAGetLastError();
+ if (e == WSAEWOULDBLOCK) return false; // 暂无数据
+ // 其它错误也认为连接不可用了
+ peerClosed = true;
+ return false;
+}
+
+bool SocketComm::sendTo(SOCKET s, const std::vector<uint8_t>& data) {
+ int sent = send(s, reinterpret_cast<const char*>(data.data()), (int)data.size(), 0);
+ return sent == (int)data.size();
+}
+
+void SocketComm::closeClient(SOCKET s) {
+ if (s != INVALID_SOCKET) closesocket(s);
+}
+
+void SocketComm::closeSocket() {
+ if (listenSock != INVALID_SOCKET) { closesocket(listenSock); listenSock = INVALID_SOCKET; }
+ if (sock != INVALID_SOCKET) { closesocket(sock); sock = INVALID_SOCKET; }
+}
+
+bool SocketComm::sendDataSingle(const std::vector<uint8_t>& data) {
+ if (sock == INVALID_SOCKET) return false;
+ return sendTo(sock, data);
+}
+bool SocketComm::recvSingle(std::vector<uint8_t>& buffer) {
+ if (sock == INVALID_SOCKET) return false;
+ return recvFrom(sock, buffer);
+}
\ No newline at end of file
--
Gitblit v1.9.3