TCP/UDP Handle List

TCP 与 UDP 协议深度对比:3 大核心差异与 10 个典型应用场景选择指南 本文深度对比了TCP与UDP协议的3大核心差异,包括连接模式、可靠性机制和传输效率,并提供了10个典型应用场景的选择指南。TCP适合需要可靠传输的场景如Web服务和文件传输,而UDP则更适合实时性要求高的应用如视频会议和在线游戏。通过详细的协议分析和实战案例,帮助开发者做出最优的协议选型决策。 阅读详情
//
// Coded By Napalm
// Modified By ZwelL
//
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <psapi.h>
#include <shlwapi.h>

#pragma comment(lib, "psapi.lib")
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "shlwapi.lib")

typedef LONG NTSTATUS;

typedef struct _IO_STATUS_BLOCK {
    union {
        NTSTATUS Status;
        PVOID Pointer;
    };
    ULONG_PTR Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;

typedef void (WINAPI * PIO_APC_ROUTINE)(PVOID, PIO_STATUS_BLOCK, DWORD);

typedef LONG TDI_STATUS;
typedef PVOID CONNECTION_CONTEXT;        // connection context

typedef struct _TDI_REQUEST {
    union {
        HANDLE AddressHandle;
        CONNECTION_CONTEXT ConnectionContext;
        HANDLE ControlChannel;
    } Handle;

    PVOID RequestNotifyObject;
    PVOID RequestContext;
    TDI_STATUS TdiStatus;
} TDI_REQUEST, *PTDI_REQUEST;

typedef struct _TDI_CONNECTION_INFORMATION {
    LONG UserDataLength;        // length of user data buffer
    PVOID UserData;            // pointer to user data buffer
    LONG OptionsLength;        // length of following buffer
    PVOID Options;             // pointer to buffer containing options
    LONG RemoteAddressLength;   // length of following buffer
    PVOID RemoteAddress;        // buffer containing the remote address
} TDI_CONNECTION_INFORMATION, *PTDI_CONNECTION_INFORMATION;

typedef struct _TDI_REQUEST_QUERY_INFORMATION {
    TDI_REQUEST Request;
    ULONG QueryType;             // class of information to be queried.
    PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
} TDI_REQUEST_QUERY_INFORMATION, *PTDI_REQUEST_QUERY_INFORMATION;

#define TDI_QUERY_ADDRESS_INFO           0x00000003
#define IOCTL_TDI_QUERY_INFORMATION      CTL_CODE(FILE_DEVICE_TRANSPORT, 4, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)

typedef VOID *POBJECT;

typedef struct _SYSTEM_HANDLE {
    ULONG       uIdProcess;
    UCHAR       ObjectType;    // OB_TYPE_* (OB_TYPE_TYPE, etc.)
    UCHAR       Flags;        // HANDLE_FLAG_* (HANDLE_FLAG_INHERIT, etc.)
    USHORT         Handle;
    POBJECT         pObject;
    ACCESS_MASK    GrantedAccess;
} SYSTEM_HANDLE, *PSYSTEM_HANDLE;

typedef struct _SYSTEM_HANDLE_INFORMATION {
    ULONG           uCount;
    SYSTEM_HANDLE     Handles[1];
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;

typedef struct _UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
    PWSTR Buffer;
} UNICODE_STRING;
typedef UNICODE_STRING *PUNICODE_STRING;
typedef const UNICODE_STRING *PCUNICODE_STRING;

typedef UNICODE_STRING OBJECT_NAME_INFORMATION;
typedef UNICODE_STRING *POBJECT_NAME_INFORMATION;

#define SystemHandleInformation           16
#define ObjectNameInformation           1
#define STATUS_SUCCESS                ((NTSTATUS)0x00000000L)
#define STATUS_INFO_LENGTH_MISMATCH       ((NTSTATUS)0xC0000004L)
#define STATUS_BUFFER_OVERFLOW           ((NTSTATUS)0x80000005L)
// -------------------------------------------------------------------------


typedef NTSTATUS (WINAPI *tNTQSI)(DWORD SystemInformationClass, PVOID SystemInformation,
                                     DWORD SystemInformationLength, PDWORD ReturnLength);
typedef NTSTATUS (WINAPI *tNTQO)(HANDLE ObjectHandle, DWORD ObjectInformationClass, PVOID ObjectInformation,
                                    DWORD Length, PDWORD ResultLength);
typedef NTSTATUS (WINAPI *tNTDIOCF)(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
                                  PIO_STATUS_BLOCK IoStatusBlock, DWORD IoControlCode,
                                  PVOID InputBuffer, DWORD InputBufferLength,
                                  PVOID OutputBuffer, DWORD OutputBufferLength);


void EnableDebugPrivilege()
{
    HANDLE hToken;
    TOKEN_PRIVILEGES tokenPriv;
    LUID luidDebug;
    if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken) != FALSE) {
        if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidDebug) != FALSE)
        {
             tokenPriv.PrivilegeCount            = 1;
             tokenPriv.Privileges [0].Luid       = luidDebug;
             tokenPriv.Privileges [0].Attributes = SE_PRIVILEGE_ENABLED;
             AdjustTokenPrivileges(hToken, FALSE, &tokenPriv, sizeof(tokenPriv), NULL, NULL);
        }
    }
}

LPWSTR GetObjectName(HANDLE hObject)
{
    LPWSTR lpwsReturn = NULL;
    tNTQO pNTQO = (tNTQO)GetProcAddress(GetModuleHandle("NTDLL.DLL"), "NtQueryObject");
    if(pNTQO != NULL){
        DWORD dwSize = sizeof(OBJECT_NAME_INFORMATION);
        POBJECT_NAME_INFORMATION pObjectInfo = (POBJECT_NAME_INFORMATION) new BYTE[dwSize];
        NTSTATUS ntReturn = pNTQO(hObject, ObjectNameInformation, pObjectInfo, dwSize, &dwSize);
        if(ntReturn == STATUS_BUFFER_OVERFLOW){
             delete pObjectInfo;
             pObjectInfo = (POBJECT_NAME_INFORMATION) new BYTE[dwSize];
             ntReturn = pNTQO(hObject, ObjectNameInformation, pObjectInfo, dwSize, &dwSize);
        }
        if((ntReturn >= STATUS_SUCCESS) && (pObjectInfo->Buffer != NULL))
        {
             lpwsReturn = (LPWSTR) new BYTE[pObjectInfo->Length + sizeof(WCHAR)];
             ZeroMemory(lpwsReturn, pObjectInfo->Length + sizeof(WCHAR));
             CopyMemory(lpwsReturn, pObjectInfo->Buffer, pObjectInfo->Length);
        }
        delete pObjectInfo;
    }
    return lpwsReturn;
}

void OutputConnectionDetails(HANDLE hObject, in_addr *ip, DWORD *port)
{
    tNTDIOCF pNTDIOCF = (tNTDIOCF)GetProcAddress(GetModuleHandle("NTDLL.DLL"), "NtDeviceIoControlFile");
    if(pNTDIOCF != NULL){
        IO_STATUS_BLOCK IoStatusBlock;
        TDI_REQUEST_QUERY_INFORMATION tdiRequestAddress = {{0}, TDI_QUERY_ADDRESS_INFO};
        BYTE tdiAddress[128];

        HANDLE hEvent2 = CreateEvent(NULL, TRUE, FALSE, NULL);
        NTSTATUS ntReturn2 = pNTDIOCF(hObject, hEvent2, NULL, NULL, &IoStatusBlock, IOCTL_TDI_QUERY_INFORMATION,
             &tdiRequestAddress, sizeof(tdiRequestAddress), &tdiAddress, sizeof(tdiAddress));
        if(hEvent2) CloseHandle(hEvent2);

        if(ntReturn2 == STATUS_SUCCESS){
             struct in_addr *pAddr = (struct in_addr *)&tdiAddress[14];
             *ip = *pAddr;
             *port = ntohs(*(PUSHORT)&tdiAddress[12]);
        }
    }
}

int main(int argc, char *argv[])
{
    printf("TCP/UDP Handle List - by Napalm/n");
    printf("Modified by ZwelL/n");
    printf("===============================/n/n");

    EnableDebugPrivilege();

    tNTQSI pNTQSI = (tNTQSI)GetProcAddress(GetModuleHandle("NTDLL.DLL"), "NtQuerySystemInformation");
    if(pNTQSI != NULL){
        DWORD dwSize = sizeof(SYSTEM_HANDLE_INFORMATION);
        PSYSTEM_HANDLE_INFORMATION pHandleInfo = (PSYSTEM_HANDLE_INFORMATION) new BYTE[dwSize];
        NTSTATUS ntReturn = pNTQSI(SystemHandleInformation, pHandleInfo, dwSize, &dwSize);
        if(ntReturn == STATUS_INFO_LENGTH_MISMATCH){
             delete pHandleInfo;
             pHandleInfo = (PSYSTEM_HANDLE_INFORMATION) new BYTE[dwSize];
             ntReturn = pNTQSI(SystemHandleInformation, pHandleInfo, dwSize, &dwSize);
        }
        if(ntReturn == STATUS_SUCCESS){
             printf(" Found %d Handles. Listing TCP/UDP Handles.../n/n", pHandleInfo->uCount);
             printf(" PID/tHandle/t%-16sHandle Name/tIP Address/tPort/n", "Process Name");
             for(DWORD dwIdx = 0; dwIdx < pHandleInfo->uCount; dwIdx++)
             {
                HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
                     FALSE, pHandleInfo->Handles[dwIdx].uIdProcess);
                if(hProcess != INVALID_HANDLE_VALUE)
                {
                     HANDLE hObject = NULL;
                     if(DuplicateHandle(hProcess, (HANDLE)pHandleInfo->Handles[dwIdx].Handle,
                          GetCurrentProcess(), &hObject, STANDARD_RIGHTS_REQUIRED, FALSE, 0) != FALSE)
                      {
                          LPWSTR lpwsName = GetObjectName(hObject);
                          if(lpwsName != NULL){
                               if(!wcscmp(lpwsName, L"//Device//Tcp") || !wcscmp(lpwsName, L"//Device//Udp"))
                               {
                                   LPSTR lpszProcess = new CHAR[MAX_PATH];
                                   struct in_addr ipaddr;
                                   DWORD port;

                                   OutputConnectionDetails(hObject, &ipaddr, &port);
                                   ZeroMemory(lpszProcess, MAX_PATH);
                                   GetModuleFileNameEx(hProcess, NULL, lpszProcess, MAX_PATH);
                                   printf("%5d/t%6d/t%-16s%-20ws%12s%7d/t%s/n",
                                       pHandleInfo->Handles[dwIdx].uIdProcess,
                                       pHandleInfo->Handles[dwIdx].Handle,
                                       ((lstrlen(lpszProcess) > 0)?PathFindFileName(lpszProcess):"[System]"),
                                       lpwsName,
                                       inet_ntoa(ipaddr),
                                       port,
                                       lpszProcess);
                                   delete lpszProcess;
                               }
                               delete lpwsName;
                          }
                          CloseHandle(hObject);
                     }
                     CloseHandle(hProcess);
                }
             }
             printf("/n/n");
        }else{
             printf("Error while trying to allocate memory for System Handle Information./n");
        }
        delete pHandleInfo;
    }else{
        printf("Cannot find NtQuerySystemInformation API... Is this system not Win2K and above?");
    }

    return 0;
}
Python多人游戏网络编程实战:从TCP到UDP状态同步 多人游戏网络编程是联机游戏开发的核心技术,它解决多个客户端共享游戏世界、实时感知彼此状态的问题。其基本原理基于客户端-服务器架构,利用TCP的可靠传输或UDP的低延迟特性进行数据通信,并设计清晰的消息协议避免粘包与半包。选择Python作为实现语言,能借助socket和threading快速搭建网络层,理解多线程并发处理与状态同步机制,适合游戏后端初学者快速入门。无论是猜数字类的回合制游戏,还是需要实时坐标同步的竞技玩法,掌握Python网络编程都能让学生从单机逻辑迈向真正的联机体验。本文通过一个可运行的多 阅读详情

相关推荐

用Python标准库实现多人游戏联网:从TCP回显到状态同步

在多人游戏开发中,网络编程是构建联机体验的核心基础。TCP作为可靠传输协议,保证了客户端与服务器之间的数据有序到达,而UDP则更适用于高频状态更新。消息边界与序列化设计是解决数据流解析的关键,直接决定了通信链路的稳定性。利用Python标准库asyncio与pygame,开发者无需依赖重型框架,即可快速搭建一个局域网内多人移动同步Demo。该Demo从TCP回显程序出发,逐步实现客户端-服务器模型下的坐标上报与广播,让开发者直观理解状态同步、广播频率和断线重连等核心问题。这种最小实践不仅能验证网络链路与协议

congji3817的博客 566

TCP/UDP Handle List [Zz]

    摘要://// Coded By Napalm// Modified By ZwelL//#include #include #include #include "psapi.h"#include #pragma comment(lib, "psapi.lib")#pragma comment(lib, "ws2_32.lib")#pragma comment(lib, "shlw

LionD8' Blog 个人作品 www.360kdj.com 360KDJ股票实验室 5286

手写生产级TCP Socket通信骨架:从阻塞到select的实战指南

TCP Socket是网络编程的底层基石,其核心在于字节流传输、连接状态管理与系统资源控制。理解TCP粘包原理、TIME_WAIT机制、SO_REUSEADDR语义及非阻塞I/O模型,是构建高可靠通信服务的前提。这些技术直接决定边缘计算、物联网网关和低延迟中间件等场景下的连接稳定性与吞吐表现。本文聚焦真实生产环境——树莓派+Linux+Python组合,详解如何用原生socket写出可压测、可排障、可运维的TCP服务骨架,覆盖bind/listen/accept生命周期、recv循环边界处理、connect

aiqixiao2017的博客 382

handle中传递对象

最近在做项目中遇到了一个怪事,我解析了一些数据,将这些数据保存到了对象中,而对象实现了序列化接口。然后将这里数据用Arraylist保存并且通过handler传递出去,我是一部分一部分的往外传递的,在传递完成一部分之后就将Arraylist里面的数据给clear了,结果发现han

但求成长,不求成功,让成功成为成长的必然结果,这就是成功最正确的道路 1692

C++ TCP Socket服务端开发:从基础API到高并发epoll实战

网络通信是分布式系统和现代应用开发的基石,而TCP协议作为可靠传输的核心,其Socket编程是每位C++开发者必须掌握的底层技能。理解Socket的本质是网络通信的端点,通过文件描述符进行读写操作,是深入操作系统网络栈的关键。从单线程阻塞模型到多线程/多进程架构,再到基于epoll的I/O多路复用技术,服务端设计的演进直接决定了系统的并发处理能力和资源效率。在实际工程中,正确处理字节序转换、粘包拆包、连接优雅关闭等细节,结合Wireshark等工具进行网络抓包分析,是构建健壮服务的保障。本文通过完整代码示例

weixin_33924312的博客 506

基于IOCP的Windows高性能TCP服务器:MFC实现与核心原理详解

在Windows平台高性能网络服务开发中,异步I/O与线程池的协同是核心技术。I/O完成端口(IOCP)作为Windows内核层面的异步I/O模型,通过“完成通知”机制实现真正的异步处理,避免了轮询带来的CPU浪费。其核心原理在于应用程序发起异步I/O操作后,由内核执行并在操作完成后将通知投递到完成端口队列,工作线程则等待并处理这些完成通知。这种模式的技术价值在于能够以最优线程数(通常为2倍CPU核心数)高效处理海量并发连接,显著提升吞吐量并减少线程切换开销。在实际应用场景中,IOCP模型特别适用于需要支撑

weixin_34161064的博客 422

List集合分批多线程处理,同时控制最大并发

业务中,要实现数据日终同步,采用将同步文件中的数据封装成List集合分批处理加多线程的方式,根据数据量动态设置线程数,同时控制最大并发数量(业务中有IO操作,避免过大并发导致堵塞),实现效率提高 //最大线程数控制 private static int MAX_THREADS= 5; //跑批分页大小 private static int EXPIRED_PAGE_SIZE = 30;...

weixin_30662109的博客 1267

从理论到代码:手把手教你用Matlab复现MMC的HSS阻抗模型(附避坑指南)

本文详细介绍了如何使用Matlab复现MMC的HSS阻抗模型,涵盖谐波状态空间(HSS)理论、代码实现步骤及常见问题解决方案。通过谐波线性化和序阻抗建模技术,帮助工程师准确分析MMC的阻抗特性,并提供避坑指南以解决矩阵维度错误、收敛性问题和频域转换陷阱等难点。

weixin_42561040的博客 359

List集合分批多线程处理

mybatis批量插入或者删除限制1000条记录,分批处理 private void close (List<PdfDataTest> closeList){ //限制次数 int limitNum=1000; if (closeList.size()<limitNum){ //执行代码逻辑 ...

人生就像一场戏 6048

Codex智能体从零搭建:环境配置、代码管理与MCP扩展实战

AI智能体(Agent)作为连接大语言模型与实际应用的关键技术,通过感知、决策与执行框架,将AI能力融入具体工作流。其核心原理在于利用提示工程、上下文管理与工具调用,将自然语言指令转化为可执行操作。在软件开发领域,AI智能体能够显著提升代码生成、项目管理和自动化任务的效率。通过Model Context Protocol(MCP)等标准化协议,智能体可以安全、结构化地集成外部工具与服务,实现能力扩展。本文聚焦于Codex这一AI驱动的代码助手平台,详细解析其环境配置、代码索引、记忆系统等核心模块,并深入探讨

weixin_34220179的博客 594

PaddleOCR实战:从零开始打造专属OCR模型的完整指南

本文提供了一份从零开始使用PaddleOCR打造专属OCR模型的完整实战指南。内容涵盖环境搭建、数据标注与准备、模型训练与调优,以及最终的模型转换与部署。重点介绍了如何利用PaddleOCR进行模型训练,并整合PPOCRLabel等工具高效准备数据集,帮助开发者快速构建适用于特定场景的高精度OCR识别能力。

rl6adventurer的博客 733

aspx里面使用List

新建的一般处理程序里面无法应用List<>,如图: 使用List方法:加上命名空间:using System.Collections.Generic;即可。

aaaPostcard的博客 935

第10章:位同步与Gardner环路(1)

第10章(1)内容如下:一、位同步与载波同步的区别1、采样时钟相位偏差的影响2、采样时钟频率偏差的影响二、Gardner环路算法与插值方法1、插值滤波器2、Gardner误差检查算法三、Gardner环路中环路滤波器与数字振荡器设计1、环路滤波器2、数控振荡器(NCO)四、Gardner环路的可运行MATLAB代码五、参考资料六、致谢 最近搞懂了Gardner环路的一些知识,于是更新第10章——位同步。 如果你稍不留意的话,这可能是你在网上能看到的介绍Gardner环路及其MATLAB仿真最详细的一篇文章了

weixin_44283855的博客 1万+

NE2-S1W以太网模组:串口转TCP/UDP透传的工业物联网解决方案

串口通信作为工业设备的基础通信接口,通过TTL电平实现设备间的数据传输。其工作原理基于异步串行通信协议,通过起始位、数据位和停止位完成数据帧的封装。在工业物联网场景中,串口转以太网技术将传统串口设备接入网络,实现远程监控和数据采集。TCP/UDP协议作为网络传输核心,TCP保证可靠传输,UDP适合实时应用。透明传输技术保持数据原样转发,确保完整性和实时性。NE2-S1W以太网模组集成了这些技术,支持工业级以太网连接和PLC远程监控,适用于智能仪表、传感器数据采集等物联网应用场景,为设备上云提供稳定可靠的通信

weixin_34372728的博客 459

C++碰撞检测库FCL安装(MinGW,CMake)

FCL碰撞检测库、libccd\Eigen库编译配置,全流程问题记录

weixin_45650767的博客 4678

基于MYD-YT153与AD7616的16通道高速ADC采集系统实战指南

在嵌入式系统与工业数据采集领域,模拟信号采集是连接物理世界与数字系统的关键技术。其核心原理是通过模数转换器(ADC)将连续的模拟电压信号转换为离散的数字码值,供处理器处理。这项技术的价值在于实现了对温度、压力、振动等关键物理量的精确感知与数字化,是工业自动化、设备监测、科学实验等场景的基石。本文聚焦于**多通道**、**高精度**采集这一常见需求,深入剖析如何利用全志T153处理器的LocalBus并行总线接口,高效驱动ADI的16位、16通道同步采样ADC芯片AD7616,构建一个稳定可靠的高速数据采集系

weixin_30335353的博客 443

如何从零手写反向传播:nn-zero-to-hero 神经网络课程完整指南

nn-zero-to-hero 把"神经网络怎么训练"这件事拆成了 7 个可执行的 notebook:你先手搓一个标量自动求导引擎,再一路写字符级语言模型,直到绕开 loss.backward() 自己推导梯度。它和照 PyTorch 文档调 API 的区别在于,每一步推导都能在你的机器上跑起来、被你逐行修改,而不只是读几行公式。课程目录在 [README.md](https://link.git

gitblog_00268的博客 945

【短距离通信】【WiFi】精讲WiFi 6E协议!图解超赞超详细!!!

802.11ax(HE,HighEfficiency) (Wi-Fi 6E):6G频段共有1200MHz的频谱给到WiFi 6E使用,可用于从5.925GHz到7.125GHz。WiFi将可以访问59个20MHz信道,29个40MHz信道14个80MHz信道和7个160MHz信道。这不仅代表可以有很多频道,还可以代表可以解锁更高的数据速率。因为 802.11ax 标准(Wi-Fi 6)也在 2.4GHz 和 5GHz 频段运行,所以 6GHz 频段的 Wi-Fi 将被命名为 Wi-Fi 6E。

风云说通信 2347

port/connection hiding

port/connection hiding@ :: worthy ::   Jun 18 2004, 15:57 (UTC+0) akcom writes: after reading HolyFathers article on rootkits, i wrote a hook to hide connections. Ive noticed a few people saying tha

执着我一生[F.S.T] 1607

MTK平台Wi-Fi学习--wifi channel 通过国家码进行功率限制和wifi eFEM 基本配置和wifi Tx SEM问题

本文介绍了WiFi功率限制配置和eFEM硬件设置方法。在功率限制方面,通过国家码可针对不同信道设置功率上限,需在rlm_txpwr_init.h文件中配置信道和功率值(单位0.5dBm),WiFi6的HE_TB模式还可分RU设置。eFEM硬件配置需参考平台设计,注意VDET接口处理,首次使用建议提交HW/SW案例审核。软件配置需获取专用FEM包,包含NVRAM、GPIO等文件,按指导合并后版本才会切换为eFEM版本。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 489

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

AT32+FreeRTOS+lwIP下UDP日志输出:嵌入式远程调试实战指南

在嵌入式系统开发中,实时获取设备状态和调试信息是保障系统稳定运行的关键。传统串口打印方式受限于物理连接和距离,难以满足分布式物联网设备的远程监控需求。网络通信技术,特别是基于UDP/IP协议栈的轻量级数据传输,为解决此问题提供了高效方案。UDP协议以其无连接、低延迟和低开销的特性,在允许少量数据丢失的场景下,相比TCP能显著节省MCU的宝贵资源(如内存和CPU时间)。这一技术价值在资源受限的嵌入式环境(如使用ARM Cortex-M内核的MCU)中尤为突出,广泛应用于环境监测、工业控制等需要远程运维的场景。

weixin_30315723的博客 368

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Python UDP Ping 服务端实现:3行核心代码解析 recvfrom() 与 sendto() 实战

本文详细解析了Python实现UDP Ping服务端的核心代码,重点介绍了recvfrom()与sendto()方法的实战应用。通过3行基础代码展示UDP通信机制,并扩展增强型实现,涵盖错误处理、性能优化及安全加固方案,帮助开发者快速构建高效的网络诊断工具。

weixin_30542079的博客 417

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Python多人游戏网络编程:用socket实现TCP位置同步Demo

网络编程是构建多人游戏联机功能的核心基础。在客户端-服务器模型下,服务器作为权威状态源,通过socket通信接收并广播玩家数据。TCP协议提供可靠的字节流传输,但也带来了粘包与拆包问题,需要应用层设计消息边界。Python凭借简洁的语法和丰富的标准库,成为快速原型验证的理想选择。基于select事件循环可实现单线程管理多客户端连接,降低资源开销。这种技术方案广泛应用于中小型游戏的位置同步、状态广播等场景。从一个Python小游戏的联机需求出发,通过一个基于TCP的多人位置同步Demo,涵盖协议设计、服务端骨

cuankuangzhong6373的博客 519

Python网络编程:从Socket基础到高级应用实战

网络编程是现代软件开发的核心技能之一,其本质是通过网络协议实现不同设备间的数据交换。Python的socket模块提供了TCP/UDP协议的底层实现,支持构建客户端-服务器架构的通信系统。TCP协议保证可靠传输但开销较大,UDP则更轻量但不保证可靠性。理解socket编程原理后,可以扩展到多线程服务器、异步IO(asyncio)等高级应用场景。在实际工程中,网络编程常用于实现RPC框架、即时通讯系统(如聊天室)和文件传输等功能。通过合理设置缓冲区大小、启用TCP_NODELAY等优化手段,可以显著提升网络应

adr5970的博客 498

socket编程 netstat 大小端 rpc(grpc) 协程 io yield

接受来自客户端的消息。缓冲区指:操作系统维护的 TCP 接收缓冲区yield把值导出给外部,不会赋值给左侧,调用send给上一次的yield的表达式赋值,即给上一次yield的左侧赋值,如果不调用send直接next,上一次yield左边会是空值,相当于发送空值send(none)

周周的博客 988
上一篇: ShellCode的另外一种玩法(远程线程注入ShellCode)[by Anskya]
下一篇: 远线程删除自身(来自SWAN)
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值