代码更新

This commit is contained in:
2025-08-04 15:01:31 +08:00
parent 746eb8bb55
commit 8d311a00b4
2 changed files with 45 additions and 6 deletions

View File

@@ -1,7 +1,6 @@
#pragma once #pragma once
#include "QCL_Include.hpp" #include "QCL_Include.hpp"
namespace QCL namespace QCL
{ {
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -48,8 +47,15 @@ namespace QCL
/** /**
* @brief 从指定客户端接收数据(单次调用) * @brief 从指定客户端接收数据(单次调用)
* @param clientSock 客户端Socket描述符 * @param clientSock 客户端Socket描述符
* @param flag:false 非阻塞模式,true 阻塞模式
*/ */
char *receiveFromClient(int clientSock); char *receiveFromClient(int clientSock,bool flag = true);
/**
* @brief 获取连接客户端的IP和端口
* @param clientSock 客户端Socket描述符
*/
char *getClientIPAndPort(int clientSock);
/** /**
* @brief 获取当前所有已连接客户端Socket的副本 * @brief 获取当前所有已连接客户端Socket的副本

View File

@@ -158,18 +158,22 @@ namespace QCL
* *
* 注意:此函数在当前设计中未在线程中使用,仅演示用。 * 注意:此函数在当前设计中未在线程中使用,仅演示用。
*/ */
char *TcpServer::receiveFromClient(int clientSock) char *TcpServer::receiveFromClient(int clientSock, bool flag)
{ {
char buffer[1024]; char buffer[1024];
std::memset(buffer, 0, sizeof(buffer)); std::memset(buffer, 0, sizeof(buffer));
ssize_t bytesReceived = recv(clientSock, buffer, sizeof(buffer) - 1, 0); ssize_t bytesReceived = 0;
if (flag)
bytesReceived = recv(clientSock, buffer, sizeof(buffer) - 1, 0);
else
bytesReceived = recv(clientSock, buffer, sizeof(buffer) - 1, MSG_DONTWAIT);
if (bytesReceived <= 0) if (bytesReceived <= 0)
{ {
std::cerr << "接收数据失败或客户端断开连接\n";
return nullptr; return nullptr;
} }
return strdup(buffer); // 返回动态分配的字符串副本 return strdup(buffer); // 返回动态分配的字符串副本
} }
@@ -183,6 +187,35 @@ namespace QCL
return clientSockets_; return clientSockets_;
} }
/**
* @brief 获取连接客户端的IP和端口
* @param clientSock 客户端Socket描述符
*/
char *TcpServer::getClientIPAndPort(int clientSock)
{
struct sockaddr_in addr;
socklen_t addr_size = sizeof(addr);
// 获取客户端地址信息
if (getpeername(clientSock, (struct sockaddr *)&addr, &addr_size) == -1)
{
perror("getpeername failed");
return NULL;
}
// 分配内存存储结果(格式: "IP:PORT")
char *result = (char *)malloc(INET_ADDRSTRLEN + 10);
if (!result)
return NULL;
// 转换IP和端口
char *ip = inet_ntoa(addr.sin_addr);
unsigned short port = ntohs(addr.sin_port);
snprintf(result, INET_ADDRSTRLEN + 10, "%s:%d", ip, port);
return result;
}
// 屏蔽所有信号 // 屏蔽所有信号
void blockAllSignals() void blockAllSignals()
{ {