得到TCP列表代码

#include <winsock2.h>  
#include <ws2tcpip.h>  
#include <iphlpapi.h>  
#include <stdio.h>  
#include "windows.h"  
#include "tchar.h"  
#include "stdio.h"  
#include "psapi.h"  
#pragma comment(lib, "iphlpapi.lib")  
#pragma comment(lib, "ws2_32.lib")  
#pragma comment(lib,"psapi.lib")   
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))  
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))  

/* Note: could also use malloc() and free() */  

int main()  
{  

    // Declare and initialize variables  
    PMIB_TCPTABLE_OWNER_PID pTcpTable;  
    DWORD dwSize = 0;  
    DWORD dwRetVal = 0;  

    char szLocalAddr[128];  
    char szRemoteAddr[128];  

    struct in_addr IpAddr;  

    int i;  

    pTcpTable = (MIB_TCPTABLE_OWNER_PID *) MALLOC(sizeof (MIB_TCPTABLE_OWNER_PID));  
    if (pTcpTable == NULL) {  
        printf("Error allocating memory\n");  
        return 1;  
    }  

    dwSize = sizeof (MIB_TCPTABLE_OWNER_PID);  
    // Make an initial call to GetTcpTable to  
    // get the necessary size into the dwSize variable  
    if ((dwRetVal = GetExtendedTcpTable(pTcpTable, &dwSize, TRUE,AF_INET,TCP_TABLE_OWNER_PID_ALL,0)) ==  
        ERROR_INSUFFICIENT_BUFFER) {  
            FREE(pTcpTable);  
            pTcpTable = (MIB_TCPTABLE_OWNER_PID *) MALLOC(dwSize);  
            if (pTcpTable == NULL) {  
                printf("Error allocating memory\n");  
                return 1;  
            }  
    }  
    // Make a second call to GetTcpTable to get  
    // the actual data we require  
    if ((dwRetVal = GetExtendedTcpTable(pTcpTable, &dwSize, TRUE,AF_INET,TCP_TABLE_OWNER_PID_ALL,0)) == NO_ERROR) {  
        printf("\tNumber of entries: %d\n", (int) pTcpTable->dwNumEntries);  
        for (i = 0; i < (int) pTcpTable->dwNumEntries; i++) {  
            printf("\n\tTCP[%d] State: %ld - ", i,  
                pTcpTable->table[i].dwState);  
            switch (pTcpTable->table[i].dwState) {  
            case MIB_TCP_STATE_CLOSED:  
                printf("CLOSED\n");  
                break;  
            case MIB_TCP_STATE_LISTEN:  
                printf("LISTEN\n");  
                break;  
            case MIB_TCP_STATE_SYN_SENT:  
                printf("SYN-SENT\n");  
                break;  
            case MIB_TCP_STATE_SYN_RCVD:  
                printf("SYN-RECEIVED\n");  
                break;  
            case MIB_TCP_STATE_ESTAB:  
                printf("ESTABLISHED\n");  
                break;  
            case MIB_TCP_STATE_FIN_WAIT1:  
                printf("FIN-WAIT-1\n");  
                break;  
            case MIB_TCP_STATE_FIN_WAIT2:  
                printf("FIN-WAIT-2 \n");  
                break;  
            case MIB_TCP_STATE_CLOSE_WAIT:  
                printf("CLOSE-WAIT\n");  
                break;  
            case MIB_TCP_STATE_CLOSING:  
                printf("CLOSING\n");  
                break;  
            case MIB_TCP_STATE_LAST_ACK:  
                printf("LAST-ACK\n");  
                break;  
            case MIB_TCP_STATE_TIME_WAIT:  
                printf("TIME-WAIT\n");  
                break;  
            case MIB_TCP_STATE_DELETE_TCB:  
                printf("DELETE-TCB\n");  
                break;  
            default:  
                printf("UNKNOWN dwState value: %d\n", pTcpTable->table[i].dwState);  
                break;  
            }  

            IpAddr.S_un.S_addr = (u_long) pTcpTable->table[i].dwLocalAddr;  
            strcpy_s(szLocalAddr, sizeof (szLocalAddr), inet_ntoa(IpAddr));  
            printf("\tTCP[%d] Local Addr: %s\n", i, szLocalAddr);  

            printf("\tTCP[%d] Local Port: %d \n", i,  
                ntohs((u_short)pTcpTable->table[i].dwLocalPort));  

            IpAddr.S_un.S_addr = (u_long) pTcpTable->table[i].dwRemoteAddr;  
            strcpy_s(szRemoteAddr, sizeof (szRemoteAddr), inet_ntoa(IpAddr));  
            printf("\tTCP[%d] Remote Addr: %s\n", i, szRemoteAddr);  

            printf("\tTCP[%d] Remote Port: %d\n", i,  
                ntohs((u_short)pTcpTable->table[i].dwRemotePort));  

            printf("\tTCP[%d] Pid: %d\n", i,  
                ntohs((u_short)pTcpTable->table[i].dwOwningPid));  

            HANDLE Handle = OpenProcess(  
                PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,  
                FALSE,  
                pTcpTable->table[i].dwOwningPid /* This is the PID, you can find one from windows task manager */  
                );  
            if (Handle)   
            {  
                TCHAR Buffer[MAX_PATH];  
                if (GetModuleFileNameEx(Handle, 0, Buffer, MAX_PATH))  
                {  
                    // At this point, buffer contains the full path to the executable  
                    printf("\tTCP[%d] name: %s\n", i,  
                        Buffer);  
                }  
                else  
                {  
                    // You better call GetLastError() here  
                }  
                CloseHandle(Handle);  
            }  
        }  
    } else {  
        printf("\tGetTcpTable failed with %d\n", dwRetVal);  
        FREE(pTcpTable);  
        return 1;  
    }  

    if (pTcpTable != NULL) {  
        FREE(pTcpTable);  
        pTcpTable = NULL;  
    }      
    system("pause");  
    return 0;      
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP,UDP服务端口,HMODULE hIpDLL = LoadLibrary( "iphlpapi.dll"); if ( !hIpDLL) return; PMIB_TCPTABLE_OWNER_PID pTcpTable(NULL); DWORD dwSize(0); PGet_Extended_TcpTable pGetExtendedTcpTable = NULL; pGetExtendedTcpTable = (PGet_Extended_TcpTable) GetProcAddress(hIpDLL, "GetExtendedTcpTable"); if(pGetExtendedTcpTable==NULL) { FreeLibrary(hIpDLL); return; } if(pGetExtendedTcpTable(pTcpTable, &dwSize, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0) == ERROR_INSUFFICIENT_BUFFER) pTcpTable = (MIB_TCPTABLE_OWNER_PID *)new char[dwSize];//重新分配缓冲区 if (pGetExtendedTcpTable(pTcpTable, &dwSize, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0) != NO_ERROR) { delete pTcpTable; return; } CString sTemp; m_PortList.DeleteAllItems(); int nNum = (int)pTcpTable->dwNumEntries; //TCP连接的数目 // nNum = 0; for (int i = 0; itable[i].dwLocalAddr))); sTemp.Format("%u",htons((WORD)pTcpTable->table[i].dwLocalPort)); m_PortList.SetItemText(i,4,sTemp); m_PortList.SetItemBgColor(i,4,RGB(210,0,0)); m_PortList.SetItemText(i,5,FormatNumToIpv4(htonl(pTcpTable->table[i].dwRemoteAddr))); sTemp.Format("%u",htons((WORD) pTcpTable->table[i].dwRemotePort)); m_PortList.SetItemText(i,6,sTemp); sTemp.Format("%u",pTcpTable->table[i].dwOwningPid); m_PortList.SetItemText(i,8,sTemp); //ProcessPidToName(pTcpTable->table[i].dwOwningPid,i); ProcessPidToNameX(pTcpTable->table[i].dwOwningPid,i); switch (pTcpTable->table[i].dwState) { case MIB_TCP_STATE_CLOSED: m_PortList.SetItemText(i,2,"CLOSED"); break; case MIB_TCP_STATE_LISTEN: m_PortList.SetItemText(i,2,"LISTEN"); break; case MIB_TCP_STATE_SYN_SENT: m_PortList.SetItemText(i,2,"SYN
### 回答1: 追踪Linux TCP/IP代码运行的过程,可以通过以下几个步骤实施: 首先,需要获得Linux内核的源代码,并找到TCP/IP协议栈的相关代码文件。这些文件通常位于“net”目录下,涉及到TCP/IP的部分大多在“net/ipv4”或“net/ipv6”目录下。 然后,我们可以选择使用调试器(如GDB)或者打印日志的方式来跟踪代码运行。如果选择使用调试器,可以在代码中设置断点,观察程序在断点处的执行情况,查看变量的值和函数的调用关系。如果使用打印日志的方式,可以在关键的代码段插入打印语句,输出相关变量的值和执行路径。 接着,我们需要了解TCP/IP协议栈的基本工作原理。具体来说,可以关注TCP的连接建立、数据传输和连接关闭等过程,以及IP协议的路由选择和分组转发等操作。 在追踪过程中,可以选择从应用层开始,如HTTP请求的发送和响应的接收。通过查看应用层的调用栈以及涉及的网络函数,可以逐步跟进到TCP/IP协议栈的代码中。同时,还可以通过观察网络数据包的发送和接收过程来了解底层数据在协议栈中的处理过程。 在跟踪代码的过程中,需要仔细观察代码中的注释和文档,以及相关的技术文档和论文,以便理解代码的设计思路和实现细节。 最后,可以通过调试器或分析日志的结果来验证自己对代码运行过程的理解,并进行必要的修复和改进。 总之,追踪Linux TCP/IP代码的运行是一个复杂而具有挑战性的任务,需要对Linux内核和网络协议有一定的了解和熟悉。同时,需要具备一定的编程和调试能力,以便在代码中找到关键的位置,并通过调试工具或日志信息来进行代码分析。 ### 回答2: 要追踪Linux TCP/IP代码运行,可以按照以下步骤进行: 1. 首先,了解TCP/IP协议栈的基本原理和相关概念,包括网络层、传输层和应用层的功能和协议。 2. 掌握Linux内核开发的基础知识,包括Linux内核的编译、调试和运行环境的搭建。 3. 下载并编译Linux内核源代码,可以从官方网站或开源代码库获取最新的Linux内核源码。 4. 在源代码中找到相关的TCP/IP代码,可以通过在源代码中搜索关键字或使用开发工具进行定位。 5. 使用调试工具来分析和追踪代码的运行。Linux内核提供了一些调试工具如Ftrace、Kprobes和SystemTap等,可以用于监视和分析内核函数的调用和运行过程。 6. 添加自定义的调试输出或断点来获取更详细的代码执行信息。通过在代码中插入printk语句或断点来观察特定变量的值或代码执行路径。 7. 使用网络抓包工具来捕获和分析网络数据包,可以验证TCP/IP代码的正确性和性能。 8. 进行测试和验证,使用各种测试工具和场景来验证TCP/IP代码的正确性和性能。 9. 探索并阅读现有的文档、论文和开发者社区的讨论,可以从中获取更多关于Linux TCP/IP代码的运行和调试技巧。 总之,追踪Linux TCP/IP代码运行需要深入理解 TCP/IP协议栈的原理,掌握Linux内核开发的基础知识,使用调试工具和网络抓包工具来分析和验证代码的运行。同时,与开发者社区保持联系,探索和学习他人的经验和技巧。 ### 回答3: 要追踪Linux TCP/IP代码的运行,首先需要一个源代码的PDF文件。我们可以从官方Linux内核网站上下载相关的源码文件,然后将其导出为PDF格式。 追踪代码运行的第一步是了解整体的调用流程。打开PDF文件,可以从文件的目录中找到TCP/IP模块的相关代码。这些文件包括传输层代码(如tcp.c)和网络层代码(如ip.c),它们负责TCP/IP协议的实现。 在PDF文件中,我们可以使用搜索功能找到特定的函数名或关键字。比如,如果希望追踪TCP的建立过程,可以搜索"tcp_accept"函数。找到这个函数后,可以查看它的调用关系,看它在哪些地方被调用,以及它又调用了哪些函数。 在追踪过程中,要注意一些关键的数据结构,例如TCP控制块(TCB)和IP包头。这些结构中包含了关键的信息,如IP地址、端口号和序列号等。可以通过搜索这些结构的定义,并在代码中追踪它们的使用。 另外,还可以使用调试工具来加速追踪的过程。在Linux系统中,可以使用GDB(GNU调试器)来逐步执行代码,并观察变量的值。这可以帮助我们更直观地理解代码的执行流程。 追踪Linux TCP/IP代码的运行需要耐心和坚持,需要仔细阅读和理解大量的代码。通过结合源代码的PDF文件和调试工具的使用,我们可以更好地理解代码的逻辑和执行过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值