一个函数实现网络故障诊断

该代码由网上的文章“微软ping程序源代码完整版”修改而来。该文实现一个完整的ping命令,为方便在其他程序中调用,在此将其封装成一个独立的函数。

BOOL Ping(char *strIP,int nTimeout,DWORD *dwErr);

strIP:目标ip;

nTimeout:超时时间,以ms为单位。

dwErr:失败时的错误代码


调用示例如下:

Ping("192.168.1.131",5000,&err);


代码如下:

#include "stdafx.h"
#pragma comment(lib,"ws2_32.lib")

#include   <winsock2.h>
#include   <stdlib.h>
#include   <stdio.h>

#define ICMP_ECHO		8 
#define ICMP_ECHOREPLY	0 
#define ICMP_MIN		8 

/* The IP header */
#pragma pack(4) 
typedef struct iphdr { 
	unsigned int h_len:4; // length of the header 
	unsigned int version:4; // Version of IP 
	unsigned char tos; // Type of service 
	unsigned short total_len; // total length of the packet 
	unsigned short ident; // unique identifier 
	unsigned short frag_and_flags; // flags 
	unsigned char ttl; 
	unsigned char proto; // protocol (TCP, UDP etc) 
	unsigned short checksum; // IP checksum 
	unsigned int sourceIP; 
	unsigned int destIP; 
}IpHeader;

// ICMP header 
typedef struct icmphdr { 
	BYTE i_type; 
	BYTE i_code; /* type sub code */ 
	USHORT i_cksum; 
	USHORT i_id; 
	USHORT i_seq; 
	/* This is not the std header, but we reserve space for time */ 
	ULONG timestamp; 
}IcmpHeader; 


#define DEF_PACKET_SIZE    8
#define MAX_PACKET 1024 



USHORT checksum(USHORT *buffer, int size)
{
	unsigned long 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); 
} 

BOOL Ping(char *strIP,int nTimeout,DWORD *dwErr)
{
	SOCKET sockRaw; 
	BOOL  bRet = FALSE;
	sockRaw = WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL, 0,WSA_FLAG_OVERLAPPED);
	if (sockRaw != INVALID_SOCKET) 
	{ 
		 setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&nTimeout, sizeof(nTimeout)); 
		 setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&nTimeout, sizeof(nTimeout)); 
		 struct sockaddr_in dest;
		 memset(&dest,0,sizeof(dest)); 
		 dest.sin_addr.s_addr = inet_addr(strIP); 
		 dest.sin_family = AF_INET; 

		 char buf[MAX_PACKET] = {0};
		 IcmpHeader *icmp_hdr =(IcmpHeader*) buf; 
		 
		 icmp_hdr->i_type = ICMP_ECHO; 
		 icmp_hdr->i_code = 0; 
		 icmp_hdr->i_id = (USHORT)GetCurrentProcessId(); 
		 icmp_hdr->i_cksum = 0; 
		 icmp_hdr->i_seq = 0; 
		 memset(buf + sizeof(IcmpHeader),'E', DEF_PACKET_SIZE); 
		 icmp_hdr->i_cksum = checksum((USHORT*)buf,DEF_PACKET_SIZE + sizeof(IcmpHeader));

		 if ( sendto(sockRaw,buf,DEF_PACKET_SIZE + sizeof(IcmpHeader),0,(struct sockaddr*)&dest,sizeof(dest)) != SOCKET_ERROR)
		 { 
			 struct sockaddr_in from; 
			 int fromlen = sizeof(sockaddr_in);
			 int nRecv = recvfrom(sockRaw,buf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen);
			 if (nRecv != SOCKET_ERROR)
			 { 
				 IpHeader *iphdr; 
				 IcmpHeader *icmphdr; 
				 unsigned short iphdrlen; 

				 iphdr = (IpHeader *)buf; 
				 iphdrlen = (iphdr->h_len) * 4 ; 
				 if (nRecv >= iphdrlen + ICMP_MIN)
				 { 
					 icmphdr = (IcmpHeader*)(buf + iphdrlen); 
					 if (icmphdr->i_type == ICMP_ECHOREPLY && icmphdr->i_id == (USHORT)GetCurrentProcessId()) 
					 { 
						bRet = TRUE;
					 } 		
				 } 
			 } 
		 } 
	}
	if (!bRet)
	{
		*dwErr = WSAGetLastError();
	}

	return bRet;
}
int main(int argc, char **argv)
{ 
	WSADATA wsaData; 
	WSAStartup(MAKEWORD(2,1),&wsaData);
	
	DWORD err = 0;
	BOOL ret = Ping("192.168.1.131",5000,&err);

	printf("ping %d %d\n",ret,err);
	WSACleanup();
	return 0; 
} 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一维卷积神经网络(1D Convolutional Neural Network,1D CNN)被广泛应用于信号处理、时间序列分析和语音识别等领域,其中故障诊断也是其研究领域之一。本文将介绍如何使用PyTorch实现一维卷积神经网络故障诊断算法。 首先,需要明确故障诊断的输入是什么。以机械设备为例,通常会监测机械振动信号,并根据信号频谱和振动特征来判断机械是否存在故障。因此,我们需要将振动信号转换成数字信号,并将数字信号作为1D CNN的输入。 接下来,我们可以使用PyTorch的nn.Module类创建一个简单的1D CNN模型。下面是一个基本的1D CNN模型: ```python import torch.nn as nn class CNNModel(nn.Module): def __init__(self): super(CNNModel, self).__init__() self.conv_layer = nn.Sequential( nn.Conv1d(in_channels=1, out_channels=64, kernel_size=3), nn.ReLU(), nn.MaxPool1d(kernel_size=2), nn.Conv1d(in_channels=64, out_channels=128, kernel_size=3), nn.ReLU(), nn.MaxPool1d(kernel_size=2), nn.Conv1d(in_channels=128, out_channels=256, kernel_size=3), nn.ReLU() ) self.fc_layer = nn.Sequential( nn.Linear(256*2, 128), nn.ReLU(), nn.Linear(128, 1) ) def forward(self, x): x = self.conv_layer(x) x = x.view(x.size(0), -1) x = self.fc_layer(x) return x ``` 该模型包括三个卷积层和两个全连接层。在卷积层、ReLu层和池化层之间,使用了Sequential()方法将这些层进行连接。在全连接层之间,也使用了Sequential()方法。在向前传播时,首先通过卷积层提取输入信号中的特征,然后将特征扁平化并传递到全连接层中获取最终输出。 此外,还需要定义损失函数和优化器。在此将使用均方误差作为损失函数,Adam作为优化器。以下是PyTorch代码的实现: ```python import torch.optim as optim model = CNNModel() criterion = nn.MSELoss() optimizer = optim.Adam(model.parameters(), lr=0.001) ``` 在训练模型时,可以使用PyTorch的DataLoader类加载训练数据和标签,并设置迭代次数和批次大小,来完成模型的训练。以下是完整的PyTorch模型训练代码: ```python import torch import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset # 加载训练数据和标签 train_data = torch.Tensor(X_train).unsqueeze(1) train_label = torch.Tensor(y_train.reshape(-1, 1)) # 创建模型 model = CNNModel() # 定义损失函数和优化器 criterion = nn.MSELoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 将数据封装为DataLoader train_dataset = TensorDataset(train_data, train_label) train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True) # 训练模型 num_epochs = 100 for epoch in range(num_epochs): for inputs, labels in train_loader: optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() if (epoch+1) % 10 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item())) # 保存训练好的模型 torch.save(model, 'cnn_model.pth') ``` 在训练完成后,可以使用测试集对模型进行测试。以下是完整的PyTorch模型测试代码: ```python # 加载测试数据和标签 test_data = torch.Tensor(X_test).unsqueeze(1) test_label = torch.Tensor(y_test.reshape(-1, 1)) # 加载模型 model = torch.load('cnn_model.pth') # 测试模型 with torch.no_grad(): predicted = model(test_data) test_loss = criterion(predicted, test_label) print('Test Loss: {:.4f}'.format(test_loss)) ``` 通过使用PyTorch实现的1D CNN模型,可以有效地对机械振动信号进行故障诊断,以及对其他类似的数据进行分析和处理,具有非常有价值的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值