代码执行到这个模块之间出现越界还是什么问题不能继续运行
//获取自己主机的MAC地址
int GetSelfMac(pcap_t* adhandle, const char* ip_addr, unsigned char* ip_mac)
{
unsigned char sendbuf[42];
int i = -1;
int res;
struct ethernet_head eh;
struct arp_head ah;
struct pcap_pkthdr* pkt_header;
const u_char* pkt_data;
memset(eh.dst_mac_add, 0xff, 6); //目的地址全为广播地址
memset(eh.src_mac_add, 0x0f, 6);
memset(ah.src_mac_add, 0x0f, 6);
memset(ah.dst_mac_add, 0x00, 6);
eh.type = htons(ETH_ARP);
ah.hardware_type = htons(ARP_HARDWARE);
ah.protocol_type = htons(ETH_IP);
ah.hardware_add_len = 6;
ah.hardware_add_len = 4;
ah.src_ip_add = inet_addr("100.100.100.100"); //随便设一个请求方ip
ah.operation_field = htons(ARP_REQUEST);
ah.dst_ip_add = inet_addr(ip_addr);
memset(sendbuf, 0, sizeof(sendbuf));
memcpy(sendbuf, &eh, sizeof(eh));
memcpy(sendbuf + sizeof(eh), &ah, sizeof(ah));
if (pcap_sendpacket(adhandle, sendbuf, 42) == 0) {
printf("\nPacketSend succeed\n");
}
else {
printf("PacketSendPacket in getmine Error: %d\n",(int) GetLastError());
return 0;
}
while ((res = pcap_next_ex(adhandle, &pkt_header, &pkt_data)) >= 0) {
if (*(unsigned short *)(pkt_data + 12) == htons(ETH_ARP)
&& *(unsigned short*)(pkt_data + 20) == htons(ARP_REPLY)
&& *(unsigned long*)(pkt_data + 38)
== inet_addr("100.100.100.100")) {
for (i = 0; i < 6; i++) {
ip_mac[i] = *(unsigned char *)(pkt_data + 22 + i);
}
printf("获取自己主机的MAC地址成功!\n");
break;
}
}
if (i == 6) {
return 1;
}
else {
return 0;
}
}
//向局域网内所有可能的IP地址发送ARP请求包线程
DWORD WINAPI SendArpPacket(LPVOID lpParameter)
{
struct sparam* spara = (struct sparam*)lpParameter;
pcap_t* adhandle = spara->adhandle;
char* ip = spara->ip;
unsigned char* mac = spara->mac;
char* netmask = spara->netmask;
printf("ip_mac:%02x-%02x-%02x-%02x-%02x-%02x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
printf("自身的IP地址为:%s\n", ip);
printf("地址掩码NETMASK为:%s\n", netmask);
printf("\n");
unsigned char sendbuf[42];
struct ethernet_head eh;
struct arp_head ah;
memset(eh.dst_mac_add, 0xff, 6);
memcpy(eh.src_mac_add, mac, 6);
memcpy(ah.src_mac_add, mac, 6);
memset(ah.dst_mac_add, 0xff, 6);
eh.type = htons(ETH_ARP);
ah.hardware_type = htons(ARP_HARDWARE);
ah.protocol_type = htons(ETH_IP);
ah.hardware_add_len = 6;
ah.protocol_add_len = 4;
ah.src_ip_add = inet_addr(ip);
ah.operation_field = htons(ARP_REQUEST);
//向局域网内广播发arp包
unsigned long myip = inet_addr(ip);
unsigned long mynetmask = inet_addr(netmask);
unsigned long hisip = htonl((myip & mynetmask));
for (int i = 0; i < HOSTNUM; i++)
{
ah.dst_ip_add = htonl(hisip + i);
memset(sendbuf, 0, sizeof(sendbuf));
memcpy(sendbuf, &eh, sizeof(sendbuf));
memcpy(sendbuf + sizeof(eh), &ah, sizeof(ah));
if (pcap_sendpacket(adhandle, sendbuf, 42) == 0)
{
printf("\nPacketSend succeed\n");
printf("\nPacketSend succeed\n");
}
else
{
printf("PacketSendPacket in getmine Error: %d\n", (int)GetLastError());
}
Sleep(50);
}
Sleep(1000);
flag = 1;
return 0;
}
//分析截留的数据包获取活动的主机IP地址
DWORD WINAPI GetLivePC(LPVOID lpParameter)
{
struct gparam* gparam = (struct gparam*)lpParameter;
pcap_t* adhandle = gparam->adhandle;
int res;
unsigned char Mac[6];
struct pcap_pkthdr* pkt_header;
const char* pkt_data;
while (1)
{
if (flag)
{
printf("扫描完毕,按任意键退出!\n");
break;
}
if ((res = pcap_next_ex(adhandle, &pkt_header, &pkt_data)) >= 0)
{
if (*(unsigned short*)(pkt_data + 12) == htons(ETH_ARP))
{
struct arp_packet* recv = (struct arp_packet*)pkt_data;
if (*(unsigned short*)(pkt_data + 20) == htons(ARP_REPLY))
{
printf("------------------------------\n");
printf("IP地址:%d.%d.%d.%d MAC地址:", recv->ah.src_ip_add & 255, recv->ah.src_ip_add >> 8 & 255,
recv->ah.src_ip_add >> 16 & 255, recv->ah.src_ip_add >> 24 & 255);
for (int i = 0; i < 6; i++)
{
Mac[i] = *(unsigned char*)(pkt_data + 22 + i);
printf("%02x", Mac[i]);
}
printf("\n");
}
}
}
Sleep(10);
}
return 0;
}
你的代码中存在一些可能的问题,可能导致程序无法正常运行。以下是一些可能的问题和解决方案:
内存越界:在你的SendArpPacket
函数中,你使用memcpy
函数将eh
和ah
结构体复制到sendbuf
中。但是,你使用sizeof(sendbuf)
作为memcpy
的长度参数,这可能会导致内存越界,因为sendbuf
的大小可能小于eh
和ah
的总大小。你应该使用sizeof(eh)
和sizeof(ah)
作为memcpy
的长度参数。
权限问题:如果你的程序在运行时需要管理员权限,但没有得到足够的权限,那么它可能无法正常运行。你可以尝试以管理员权限运行你的程序。
网络问题:如果你的网络设置或网络设备有问题,那么你的程序可能无法正常运行。你应该检查你的网络设置和网络设备,确保它们能够正常工作。
错误的IP地址或MAC地址:如果你提供的IP地址或MAC地址是错误的,那么你的程序可能无法正常运行。你应该检查你的IP地址和MAC地址,确保它们是正确的。
如果以上的建议都无法解决你的问题,你可能需要使用调试工具来调试你的程序,找出导致程序无法正常运行的具体原因。
不知道你这个问题是否已经解决, 如果还没有解决的话:问题描述
魔术师发牌问题的简介:一位魔术师掏出一叠扑克牌,魔术师取出其中13张黑桃,洗好后,把牌面朝下。
说:“我不看牌,只数一数就能知道每张牌是什么?”魔术师口中念一,将第一张牌翻过来看正好是A;
魔术师将黑桃A放到桌上,继续数手里的余牌,
第二次数1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌子上。
第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张牌,正好是黑桃3,这样依次将13张牌翻出,全部都准确无误。
示例代码(C语言)魔术师发牌 Visual Studio 2019
/**
* 数据结构 C语言 魔术师发牌
* @FileName MagicCard.c
* @author W.Lionel.Esaka
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define Status int;
#define CORRECT 1;
#define ERROR 0;
#define OVERFLOW -1;
#define CardNumber 13;
typedef int ElemType;
/*定义循环链表结点*/
typedef struct CLinkedList {
ElemType data;
struct CLinkedList* Next;
}Node;
/*初始化链表*/
void ListInit(Node** p, int number)
{
int item = 0;
Node* temp;
Node* target;
for (int i = 1; i <= number; i++)
{
if (*p == NULL)
{
*p = (Node*)malloc(sizeof(Node));
if (!*p)exit(0);
(*p)->data = item;
(*p)->Next = *p;
}
else
{
for (target = *p; target->Next != *p; target = target->Next);
temp = (Node*)malloc(sizeof(Node));
if (!temp)exit(0);
temp->data = item;
temp->Next = *p;
target->Next = temp;
}
}
}
/*设定牌堆顺序*/
void CardOrder(Node** card)
{
int PokerSize = 2;
Node* temp;
temp = (*card);
(*card)->data = 1;
while (1)
{
for (int j = 0; j < PokerSize; j++)
{
temp = temp->Next;
if (temp->data != 0)
{
temp->Next;
j--;
}
}
if (temp->data == 0)
{
temp->data = PokerSize;
PokerSize++;
if (PokerSize == 14)
break;
}
}
}
/*遍历链表*/
void CardDisplay(Node* list)
{
Node* target;
target = list;
do {
printf("黑桃%d ", target->data);
target = target->Next;
} while (target != list);
printf("\n");
}
/*销毁链表*/
void DestoryList(Node** list)
{
Node* ptr = (*list);
Node* buff[13];
int i = 0;
while (i < 13)
{
buff[i++] = ptr;
ptr = ptr->Next;
}
for (i = 0; i < 13; i++)
{
free(buff[i]);
}
*list = 0;
printf("表已销毁\n");
}
/*入口*/
int main(void)
{
Node* list = NULL;
ListInit(&list, 13);
CardOrder(&list);
CardDisplay(list);
DestoryList(&list);
}