代码更新
This commit is contained in:
@@ -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的副本
|
||||||
|
@@ -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()
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user