ipv6 nd

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>

#define BUFSIZE 8192

void processNeighMessage(struct nlmsghdr *nlheader, const char *targetIPv6, int *neighborFound, char *macAddress, char *interfaceName) {
    struct ndmsg *ndm = (struct ndmsg*)NLMSG_DATA(nlheader);
    struct rtattr *rta = (struct rtattr*)NDA_RTA(ndm);

    while (RTA_OK(rta, nlheader->nlmsg_len)) {
        if (rta->rta_type == NDA_DST) {
            struct in6_addr *ipv6addr = (struct in6_addr*)RTA_DATA(rta);
            char ipv6str[INET6_ADDRSTRLEN];
            inet_ntop(AF_INET6, ipv6addr, ipv6str, INET6_ADDRSTRLEN);
            printf("IPv6 Address: %s\n", ipv6str);

            if (strcmp(ipv6str, targetIPv6) == 0) {
                printf("IPv6 Neighbor found for %s.\n", targetIPv6);

                // Extract MAC address
                struct rtattr *mac_rta = (struct rtattr*)NDA_RTA(ndm);
                while (RTA_OK(mac_rta, nlheader->nlmsg_len)) {
                    if (mac_rta->rta_type == NDA_LLADDR) {
                        unsigned char *mac = (unsigned char*)RTA_DATA(mac_rta);
                        sprintf(macAddress, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
                                mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
                        printf("MAC Address: %s\n", macAddress);
                        *neighborFound = 1;
                        break;
                    }
                    mac_rta = RTA_NEXT(mac_rta, nlheader->nlmsg_len);
                }

                // Extract interface name
                strncpy(interfaceName, ndm->ndm_ifname, IFNAMSIZ - 1);
                interfaceName[IFNAMSIZ - 1] = '\0';
                printf("Interface Name: %s\n", interfaceName);
                return;
            }
        }
        rta = RTA_NEXT(rta, nlheader->nlmsg_len);
    }
}

int checkIPv6Neighbor(int ifindex, const char *targetIPv6, char *macAddress, char *interfaceName) {
    int sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
    if (sock == -1) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    struct sockaddr_nl nladdr;
    memset(&nladdr, 0, sizeof(struct sockaddr_nl));
    nladdr.nl_family = AF_NETLINK;

    struct {
        struct nlmsghdr nlh;
        struct ndmsg ndm;
    } request;

    memset(&request, 0, sizeof(request));

    request.nlh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndmsg));
    request.nlh.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
    request.nlh.nlmsg_type = RTM_GETNEIGH;
    request.ndm.ndm_family = AF_INET6;
    request.ndm.ndm_ifindex = ifindex;

    if (sendto(sock, &request, sizeof(request), 0, (struct sockaddr*)&nladdr, sizeof(nladdr)) == -1) {
        perror("sendto");
        close(sock);
        exit(EXIT_FAILURE);
    }

    char buffer[BUFSIZE];
    struct nlmsghdr *nlheader;

    int neighborFound = 0;

    ssize_t received = recv(sock, buffer, sizeof(buffer), 0);
    if (received < 0) {
        perror("recv");
        close(sock);
        exit(EXIT_FAILURE);
    }

    for (nlheader = (struct nlmsghdr*)buffer; NLMSG_OK(nlheader, (size_t)received); nlheader = NLMSG_NEXT(nlheader, received)) {
        if (nlheader->nlmsg_type == NLMSG_DONE) {
            close(sock);
            if (neighborFound) {
                printf("IPv6 Neighbor found.\n");
            } else {
                printf("No matching IPv6 Neighbor found for %s.\n", targetIPv6);
            }
            return neighborFound;  // No matching neighbor found
        }

        if (nlheader->nlmsg_type == NLMSG_ERROR) {
            fprintf(stderr, "Netlink request error\n");
            close(sock);
            exit(EXIT_FAILURE);
        }

        processNeighMessage(nlheader, targetIPv6, &neighborFound, macAddress, interfaceName);
    }

    close(sock);
    return neighborFound;
}

int main() {
    int ifindex = 2;  // Replace with your actual interface index
    const char *targetIPv6 = "fe80::1";  // Replace with the IPv6 address you want to check
    char macAddress[18];  // Buffer to store MAC address (including null terminator)
    char interfaceName[IFNAMSIZ];  // Buffer to store interface name

    if (checkIPv6Neighbor(ifindex, targetIPv6, macAddress, interfaceName)) {
        // You can use macAddress and interfaceName as needed
        printf("MAC Address: %s\n", macAddress);
        }

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <unistd.h>
#define MAX_NEIGHBORS 1024
int main(int argc, char **argv) {
    int sock;
    struct rtattr *tb[RTA_MAX + 1];
    struct rtmsg *rtm;
    char *target_ip;
    int i;
    int found = 0;
    if (argc != 3) {
        printf("Usage: %s <family> <target>\n", argv[0]);
        exit(1);
    }
    sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
    if (sock == -1) {
        perror("socket");
        exit(1);
    }
    target_ip = argv[2];
    memset(tb, 0, sizeof(tb));
    tb[RTA_DST] = rtm_family_attr(AF_INET6);
    rtm = (struct rtmsg *)tb[RTA_DST];
    rtm->rtm_family = AF_INET6;
    rtm->rtm_dst_len = IPV6_ADDR_LEN;
    rtm->rtm_type = RTN_UNICAST;
    rtm->rtm_scope = RT_SCOPE_HOST;
    rtm->rtm_table = RT_TABLE_MAIN;
    rtm->rtm_protocol = RTPROT_STATIC;
    rtm->rtm_flags = RTM_F_LOOKUP_TABLE;
    if (setsockopt(sock, SOL_NETLINK, RTM_GETNEIGH, tb, sizeof(tb)) == -1) {
        perror("setsockopt");
        exit(1);
    }
    if (recv(sock, &rtm, sizeof(rtm), 0) == -1) {
        perror("recv");
        exit(1);
    }
    for (i = 0; i < RTA_PAYLOAD(rtm); i += RTA_ALIGN(sizeof(struct rtattr))) {
        struct rtattr *rta = (struct rtattr *)&rtm[i];
        if (rta->rta_type == RTA_DST) {
            char *addr = RTA_DATA(rta);
            if (memcmp(addr, target_ip, IPV6_ADDR_LEN) == 0) {
                found = 1;
                break;
            }
        } else if (rta->rta_type == RTA_GENMASK) {
            break;  // ignore netmask attribute for IPv6 neighbor table lookup. we only care about the destination address.
        } else if (rta->rta_type != RTA_NEXT) {
            printf("Unknown attribute type %d encountered.\n", rta->rta_type);  // unexpected attribute encountered. we should handle it gracefully and not terminate the loop. just print a message and continue to the next iteration.

 

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <sys/types.h>
#include <sys/socket.h>

void closePortConnections(int port) {
    // 创建套接字
    int server_socket = socket(AF_INET, SOCK_STREAM, 0);

    // 设置服务器地址结构
    struct sockaddr_in server_address;
    memset(&server_address, 0, sizeof(server_address));
    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = htonl(INADDR_ANY);
    server_address.sin_port = htons(port);

    // 绑定套接字
    bind(server_socket, (struct sockaddr*)&server_address, sizeof(server_address));

    // 开始监听
    listen(server_socket, 5);

    // 关闭指定端口上的所有连接
    int optval = 1;
    setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));

    // 关闭套接字
    close(server_socket);
    
    printf("关闭端口 %d 上的所有连接成功\n", port);
}

int main() {
    int portToClose = 8080;  // 替换为你要关闭的端口号
    closePortConnections(portToClose);

    return 0;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值