这几天参考网上的RawSocket初步些了个,但发现丢包现象严重,效果很不理想很多时候都嗅探不出来
后来借助httpwatch的API接口页很理想,大家有什么关于.net上的实现思虑么? vb.net或c#都行
下面这个基类是我仿照网上些的
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Net.Sockets;
using System.Net;
namespace v.sniffer
{
/**
* IP数据包结构,解释完毕的包存放到这里,最终用它来组成总的数据
*/
[StructLayout(LayoutKind.Explicit)]
public struct IPHeader
{
[FieldOffset(0)]
public byte ip_verlen; //I4位首部长度+4位IP版本号
[FieldOffset(1)]
public byte ip_tos; //8位服务类型TOS
[FieldOffset(2)]
public ushort ip_totallength; //16位数据包总长度(字节)
[FieldOffset(4)]
public ushort ip_id; //16位标识
[FieldOffset(6)]
public ushort ip_offset; //3位标志位
[FieldOffset(8)]
public byte ip_ttl; //8位生存时间 TTL
[FieldOffset(9)]
public byte ip_protocol; //8位协议(TCP, UDP, ICMP, Etc.)
[FieldOffset(10)]
public ushort ip_checksum; //16位IP首部校验和
[FieldOffset(12)]
public uint ip_srcaddr; //32位源IP地址
[FieldOffset(16)]
public uint ip_destaddr; //32位目的IP地址
}
public class RawSocket
{
private bool error_occurred; //套接字在接收包时是否产生错误
public bool KeepRunning; //是否继续进行
private int len_receive_buf; //得到的数据流的长度
byte[] receive_buf_bytes; //收到的字节
private Socket socket = null; //声明套接字
const int SIO_RCVALL = unchecked((int)0x98000001);//监听所有的数据包
/**
* 构造函数
*/
public RawSocket()
{
error_occurred = false;//没有产生错误
len_receive_buf = 4096;//接收的数据流的长度
receive_buf_bytes = new byte[len_receive_buf];//接收的内容
}
/**
* 建立并绑定套接字
*
* @param 要监听的IP地址,单网卡的可以直接通过Dns.GetHostByName(Dns.GetHostEntry()).AddressList[0].ToString()方式来指定监听本地
*/
public void CreateAndBindSocket(string IP)
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
socket.Blocking = false; //设置socket非阻塞状态
socket.Bind(new IPEndPoint(IPAddress.Parse(IP), 0)); //绑定套接字
if (SetSocketOption() == false) error_occurred = true;//开始侦听数据
}
/**
* 侦听数据包的参数
*/
private bool SetSocketOption() //设置raw socket
{
bool ret_value = true;
try
{
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1);
byte[] IN = new byte[4] { 1, 0, 0, 0 };
byte[] OUT = new byte[4];
//低级别操作模式,接受所有的数据包,这一步是关键,必须把socket设成raw和IP Level才可用SIO_RCVALL
int ret_code = socket.IOControl(SIO_RCVALL, IN, OUT);
ret_code = OUT[0] + OUT[1] + OUT[2] + OUT[3];//把4个8位字节合成一个32位整数
if (ret_code != 0) ret_value = false;
}
catch (SocketException)
{
ret_value = false;
}
return ret_value;
}
public bool ErrorOccurred
{
get
{
return error_occurred;
}
}
//解析接收的数据包,形成PacketArrivedEventArgs事件数据类对象,并引发PacketArrival事件
unsafe private void Receive(byte[] buf, int len)
{
byte temp_protocol = 0;//协议
uint temp_version = 0;//版本
uint temp_ip_srcaddr = 0;//源地址
uint temp_ip_destaddr = 0;//目的地址
short temp_srcport = 0;//源端口
short temp_dstport = 0;//目标端口
IPAddress temp_ip;//IP地址
PacketArrivedEventArgs e = new PacketArrivedEventArgs();//新网络数据包信息事件
fixed (byte* fixed_buf = buf)
{
IPHeader* head = (IPHeader*)fixed_buf;//把数据流整和为IPHeader结构
e.HeaderLength = (uint)(head->ip_verlen & 0x0F) << 2;
e.IPHeaderBuffer = new byte[e.HeaderLength];
temp_protocol = head->ip_protocol;
switch (temp_protocol)//提取协议类型
{
case 1: e.Protocol = "ICMP"; break;
case 2: e.Protocol = "IGMP"; break;
case 6: e.Protocol = "TCP"; break;
case 17: e.Protocol = "UDP"; break;
default: e.Protocol = "UNKNOWN"; break;
}
temp_version = (uint)(head->ip_verlen & 0xF0) >> 4;//提取IP协议版本
e.IPVersion = temp_version.ToString();
//以下语句提取出了PacketArrivedEventArgs对象中的其他参数
temp_ip_srcaddr = head->ip_srcaddr;
temp_ip_destaddr = head->ip_destaddr;
temp_ip = new IPAddress(temp_ip_srcaddr);
e.OriginationAddress = temp_ip.ToString();
temp_ip = new IPAddress(temp_ip_destaddr);
e.DestinationAddress = temp_ip.ToString();
temp_srcport = *(short*)&fixed_buf[e.HeaderLength];
temp_dstport = *(short*)&fixed_buf[e.HeaderLength + 2];
e.OriginationPort = IPAddress.NetworkToHostOrder(temp_srcport).ToString();
e.DestinationPort = IPAddress.NetworkToHostOrder(temp_dstport).ToString();
e.PacketLength = (uint)len;
e.MessageLength = (uint)len - e.HeaderLength;
e.MessageBuffer = new byte[e.MessageLength];
e.ReceiveBuffer = buf;
//把buf中的IP头赋给PacketArrivedEventArgs中的IPHeaderBuffer
Array.Copy(buf, 0, e.IPHeaderBuffer, 0, (int)e.HeaderLength);
//把buf中的包中内容赋给PacketArrivedEventArgs中的MessageBuffer
Array.Copy(buf, (int)e.HeaderLength, e.MessageBuffer, 0, (int)e.MessageLength);
}
//引发PacketArrival事件
OnPacketArrival(e);
}
public void Run() //开始监听
{
if (socket != null)
{
IAsyncResult ar = socket.BeginReceive(receive_buf_bytes, 0, len_receive_buf, SocketFlags.None, new AsyncCallback(CallReceive), this);
}
}
private void CallReceive(IAsyncResult ar)//异步回调
{
if (socket != null)
{
try
{
int received_bytes;
received_bytes = socket.EndReceive(ar);
Receive(receive_buf_bytes, received_bytes);
if (KeepRunning) Run();
}catch (Exception e) { }
}
}
public void Shutdown() //关闭raw socket
{
if (socket != null)
{
try
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
socket = null;
}catch (Exception e) { }
}
}
public delegate void PacketArrivedEventHandler(Object sender, PacketArrivedEventArgs args);
//事件句柄:包到达时引发事件
public event PacketArrivedEventHandler PacketArrival;//声明时间句柄函数
private void OnPacketArrival(PacketArrivedEventArgs e)
{
PacketArrivedEventHandler temp = PacketArrival;
if (temp != null)
temp(this, e);
}
public class PacketArrivedEventArgs : EventArgs
{
public uint HeaderLength;
public string Protocol;
public string IPVersion;
public string OriginationAddress;
public string DestinationAddress;
public string OriginationPort;
public string DestinationPort;
public uint PacketLength;
public uint MessageLength;
public byte[] ReceiveBuffer;
public byte[] IPHeaderBuffer;
public byte[] MessageBuffer;
public PacketArrivedEventArgs()
{
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.Append("/r/n----------------/r/n");
sb.AppendFormat("src = {0}:{1}, dst= {2}:{3}/r/n", OriginationAddress, OriginationPort,
DestinationAddress, DestinationPort);
sb.AppendFormat("protocol = {0}, ipVersion={1}/r/n", Protocol, IPVersion);
sb.AppendFormat("PacketLength={0},MessageLength={1}", PacketLength, MessageLength);
sb.Append("/r/n----------------/r/n");
return sb.ToString();
}
}
}
}
这个是我的主窗口调用
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using v.sniffer;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Collections;
namespace v.winForms
{
public partial class listen : Form
{
private Hashtable ht = new Hashtable();
private System.Data.DataTable httpTable =new DataTable("httpList");
private RawSocket socket = null;
delegate void mydelegate();//表单子线程代理
public listen()
{
InitializeComponent();
}
private void btn_browser_Click(object sender, EventArgs e)
{
if (!this.btn_ListenStart.Enabled)
{
this.startRequest();
}
else
{
MessageBox.Show("请先打开监听,在开始请求");
}
}
private void startRequest()
{
if (!listenUrl.Text.Equals(""))
{
v.winForms.easyBrowser eBrowser = new easyBrowser();
eBrowser.openUrl(listenUrl.Text);
if (chkDebugMode.Checked)
{
eBrowser.Show();
}
}
}
private void btn_ListenStart_Click(object sender, EventArgs e)
{
this.listenList.Invoke(new mydelegate(ListenThread));//初始化合同服务分类
this.btn_ListenStart.Enabled = false;
this.btn_ListenStop.Enabled = true;
}
private void btn_ListenStop_Click(object sender, EventArgs e)
{
this.listenList.Invoke(new mydelegate(ListenStop));//初始化合同服务分类
this.btn_ListenStart.Enabled = true;
this.btn_ListenStop.Enabled = false;
}
private void ListenStop()
{
if (this.socket != null)
{
this.socket.Shutdown();
}
}
/**
* 侦听线程
*/
public void ListenThread()
{
try
{
socket = new RawSocket();
IPAddress hosts = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
socket.CreateAndBindSocket(hosts.ToString());
if (socket.ErrorOccurred)
{
MessageBox.Show("侦听出错了");
return;
}
socket.KeepRunning = true;
socket.PacketArrival += socket_PacketArrival;
socket.Run();
this.startRequest();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
throw;
}
finally
{
}
}
private void appendRow(string strUrl,string strContentType)
{
string[] arrSubItem = new string[2];
arrSubItem[0] = strUrl;
arrSubItem[1] = strContentType;
ListViewItem LiItem = new ListViewItem(arrSubItem, 0);
LiItem.Tag = "这里可以存储额外的信息";
this.listenList.Items.Add(LiItem);
}
private string byte2str(byte[] barr)
{
return Encoding.UTF8.GetString(barr).Trim();
/*
*System.Text.UnicodeEncoding converter = new System.Text.UnicodeEncoding();
string strRequest = converter.GetString(httpData).Trim();
//string strRequest = Encoding.ASCII.GetString(httpData).Trim();//UTF8
*/
}
void socket_PacketArrival(object sender, RawSocket.PacketArrivedEventArgs args)
{
[color=#FF0000] string localIp = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0].ToString();
if (args.Protocol == "TCP" && args.OriginationAddress == localIp) // && (args.OriginationAddress == localIp || args.DestinationAddress == localIp)
{
byte[] httpData = new byte[args.MessageLength];
Buffer.BlockCopy(args.MessageBuffer, 0, httpData, 0, httpData.Length);
string strRequest = Encoding.UTF8.GetString(httpData).Trim();
v.sniffer.headerSplit hSplit = new v.sniffer.headerSplit();
hSplit.setHeader(strRequest);
string strHost = hSplit.getHost();
string strPath = hSplit.getPath();
string strPort = args.DestinationPort;
string strContentType = hSplit.getContentType();
if (strPort.Equals("80"))
{
strPort = "";
}
else
{
strPort = ":" + strPort;
}
//if (!strHost.Equals(""))
{
string strUrl = "http://" + strHost + strPort + strPath;
string strKey = args.OriginationPort + args.DestinationAddress + args.DestinationPort;
MessageBox.Show(strUrl);
if (ht.Contains(strKey))
{
ht[strKey] = strUrl;
}
else
{
ht.Add(strKey, strUrl);
}
}
if (!strContentType.Equals(""))
{
string strKey = args.DestinationPort + args.OriginationAddress + args.OriginationPort;
string strUrl = "";
if (ht.Contains(strKey))
{
strUrl = ht[strKey].ToString();
ht.Remove(strKey);
}
bool isCheckType=(this.chk_listenType.Checked == false && strContentType.Contains("video/x-flv")||(this.chk_listenType.Checked == true));
if(!strUrl.Equals(""))
{
if (isCheckType)
{
this.appendRow(strUrl, strContentType);
}
DataRow dataRow = httpTable.NewRow();
dataRow["url"] = strUrl;
dataRow["type"] = strContentType;
httpTable.Rows.Add(dataRow);
}[/color]
}
}
}
private void listen_Load(object sender, EventArgs e)
{
httpTable.Columns.Add("url", Type.GetType("System.String"));
httpTable.Columns.Add("type", Type.GetType("System.String"));
/*
System.Windows.Forms.ColumnHeader urlColumn = new System.Windows.Forms.ColumnHeader();
urlColumn.Text = "URL地址";
urlColumn.Width = 500;
this.listenList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { urlColumn });
*/
}
private void btn_listClear_Click(object sender, EventArgs e)
{
this.listenList.Items.Clear();
httpTable.Rows.Clear();
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
this.listenList.Items.Clear();
for (int i = 0; i < httpTable.Rows.Count; i++)
{
bool isCheckType = (this.chk_listenType.Checked == false && httpTable.Rows[i]["type"].ToString().Contains("video/x-flv") || (this.chk_listenType.Checked == true));
if (!httpTable.Rows[i]["url"].Equals(""))
{
if (isCheckType)
{
string[] arrSubItem = new string[2];
arrSubItem[0] = httpTable.Rows[i]["url"].ToString();
arrSubItem[1] = httpTable.Rows[i]["type"].ToString();
ListViewItem LiItem = new ListViewItem(arrSubItem, 0);
LiItem.Tag = "这里可以存储额外的信息";
this.listenList.Items.Add(LiItem);
}
}
}
}
private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
{
}
}
}
这个是分析http头用的
using System;
using System.Collections.Generic;
using System.Text;
namespace v.sniffer
{
class headerSplit
{
private string[] Arrheader;
public void setHeader(string strHeader)
{
this.Arrheader = strHeader.Split("/r/n/r/n".ToCharArray());
}
public string getPath()
{
string strPath = "";
for (int i = 0; i < this.Arrheader.Length; i++)
{
bool matchPath = new System.Text.RegularExpressions.Regex("GET /.+ HTTP/").IsMatch(this.Arrheader[i].ToUpper()); // 在字符串中匹配
if (matchPath)
{
string[] tmp = this.Arrheader[i].Split(" ".ToCharArray());
for (int j = 0; j < tmp.Length; j++)
{
bool matchGet = new System.Text.RegularExpressions.Regex("GET").IsMatch(tmp[j].ToUpper());
int next = j + 1;
if (matchGet && next < tmp.Length)
{
strPath = tmp[next].Trim();
break;
}
}
}
if (!strPath.Equals(""))
{
break;
}
}
return strPath;
}
public string getHost()
{
string strHost = "";
for (int i = 0; i < this.Arrheader.Length; i++)
{
bool matchHost = new System.Text.RegularExpressions.Regex("HOST: ").IsMatch(this.Arrheader[i].ToUpper()); // 在字符串中匹配
if (matchHost)
{
string[] tmp = this.Arrheader[i].Split(" ".ToCharArray());
for (int j = 0; j < tmp.Length; j++)
{
bool matchGet = new System.Text.RegularExpressions.Regex("HOST:").IsMatch(tmp[j].ToUpper());
int next = j + 1;
if (matchGet && next < tmp.Length)
{
strHost = tmp[next].Trim();
break;
}
}
}
if (!strHost.Equals(""))
{
break;
}
}
return strHost;
}
public string getContentType()
{
string strReturn = "";
for (int i = 0; i < this.Arrheader.Length; i++)
{
bool boomatch = new System.Text.RegularExpressions.Regex("CONTENT-TYPE: ").IsMatch(this.Arrheader[i].ToUpper()); // 在字符串中匹配
if (boomatch)
{
string[] tmp = this.Arrheader[i].Split(" ".ToCharArray());
for (int j = 0; j < tmp.Length; j++)
{
bool matchGet = new System.Text.RegularExpressions.Regex("CONTENT-TYPE:").IsMatch(tmp[j].ToUpper());
int next = j + 1;
if (matchGet && next < tmp.Length)
{
strReturn = tmp[next].Trim();
break;
}
}
}
if (!strReturn.Equals(""))
{
break;
}
}
return strReturn;
}
}
}
这个是调用IE的插件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace v.winForms
{
public partial class easyBrowser : Form
{
public easyBrowser()
{
InitializeComponent();
}
private void easyBrowser_Load(object sender, EventArgs e)
{
//objBrowser.Navigate(txt_url.Text);
}
private void btn_go_Click(object sender, EventArgs e)
{
objBrowser.Navigate(txt_url.Text);
}
public void openUrl(string url)
{
txt_url.Text = url;
objBrowser.Navigate(url);
}
private void objBrowser_DownloadComplete(object sender, EventArgs e)
{
}
private void objBrowser_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
{
}
}
}
相关推荐
C# WinForm 网络嗅探器 带源码
一、功能简介: 1.针对同一局域网中的所有主机进行监听并返回处理优化后的数据供用户研究使用; 2.在数据表中显示了所有当前侦听到的数据包包括源IP、源端口、目的IP、目的端口、数据包协议类型、数据包捕获时间及数据包简略信息(仅应用层数据); 3.可以对某种特定类型协议的数据进行针对性监听; 4.可以针对某一特定源IP地址进行侦听; 5.当数据过多时可以随时点击‘清理’对当前的数据表进行清空 - 不过捕获的数据是不会被清除的,仅清除列表中的数据; 6.在数据显示区域可以通过选择特定字符串以此查看在其左侧的十六进制表示以供研究之用; 7.在应用左下角显示当前应用在该局域网中捕获到的数据包个数及总大小(该大小包含IP协议及其建立在该协议以上协议的头部)- 当数据大小达到2G时将重置清零; 8.在获取数据包后可以针对某一IP或IP:PORT或IP/PORT及协议进行筛选,同时可以查阅当前所有的捕获的数据包(如果没有设置捕获前过滤,否则只能查阅过滤后的数据)。 二、安装环境说明:本应用的安装环境为Windows 7、Windows 8及Windows 8.1。 三、安装过程说明 1.在安装过程中需要获得管理员权限 - 捕获数据包需要访问底层数据,需要获得最高权限才可以正常运行该应用; 2.在安装结束时,用户可以选择此时启动应用还是结束安装流程;当选择此时启动时系统会再次提醒用户允许应用获取管理员权限-原因同上。 四、作者留言 该应用的开发环境为VS2013,所用语言为C#,界面设计属于WinForm(比较老式的界面风格,推荐使用WPF),在后期程序发布打包使用的是InstallShield Limited Edition(如果需要长期打包窗体应用发布最好购买正版,可以获得更多个性化的功能)。因本人水平有限,在该应用中不免存在很多漏洞和不足;如果你有更多更好的想法或者发现该小应用中的bug还望批评指正。 ||联系方式:LHearen@gmail.com|| 五、免责声明 本系统仅用于学习交流之用,本人不承担该应用的技术及版权问题,且不对该应用负法律责任。
关于c#实现影音嗅探的问题
这几天参考网上的RawSocket初步些了个,但发现丢包现象严重,效果很不理想很多时候都嗅探不出来后来借助httpwatch的API接口页很理想,大家有什么关于.net上的实现思虑么? vb.net或c#都行 下面这个基类是我仿照网上些的using System;using System.Collections.Generic;using System.Text;using System.Run
Sniff C#版的SNIFF 嗅探器
c# 开发的 嗅探器 可以嗅探网络的所有数据包 由VS2005+c#开发
C# Socket连接状态的判定以及断线重连
一、网上常用方法 1、当Socket.Conneted == false时,调用如下函数进行判断 点击(此处)折叠或打开 /// <summary> /// 当socket.connected为false时,进一步确定下当前连接状态 /// </summary> /// <returns></returns> privateboolI...
win10下Miracast无线投屏使用教程及异常解决方案(超详细)
文章目录一、什么是Miracast?二、主流的无线投屏技术有哪些特点?三、如何查看自己的win10电脑是否支持Miracast无线投屏功能?四、win10电脑如何使用Miracast无线投屏功能? 一、什么是Miracast? Miracast是由Wi-Fi联盟于2012年所制定,以Wi-Fi直连(Wi-Fi Direct)为基础的无线显示标准。支持此标准的3C设备(如智能手机、电视、投影、电脑等...
人形机器人系列——硬件介绍
人形机器人是多领域交叉技术的产物,主要由三大系统组成:感知系统、决策系统和执行系统。感知系统感知系统是人形机器人获取外界信息的途径,主要由各种传感器组成。其中,视觉传感器用于获取图像信息,如摄像头、激光雷达等;触觉传感器用于感知触碰和压力,如力/力矩传感器、声学传感器等。这些传感器收集到的信息为机器人的决策和执行提供基础。决策系统决策系统是人形机器人的大脑,负责处理和决策各种信息。它由芯片和算法组成。芯片是硬件基础,提供计算能力;算法是软件基础,用于处理和分析传感器收集到的信息,并做出相应的决策。执行系统。
c# Socket属性
最近在弄一个untity3D 的一个项目,目前在写网络m
Mac和VScode配置fortran
macOS系统 vscode fortran gfortran 终端
C#网络编程(一.2、Socket)
参考链接: http://blog.youkuaiyun.com/lyh916/article/details/49760325;http://www.devsiki.com/。 Socket socket常用api: 1.public enum AddressFamily:指定 Socket 类的实例可以使用的寻址方案。常用的取值为InterNetwork,表示IP 版本 4 的地址。 2.pub
【智能机器人开发全流程:硬件选型、软件架构与ROS实战,打造高效机器人系统】
通过模块化设计与ROS框架的灵活扩展,可快速搭建适应不同场景的机器人系统。实际开发中需重点关注。
PyCharm与MicroPython联手:打造高效ESP32开发环境
本文详细介绍了如何使用PyCharm与MicroPython打造高效的ESP32开发环境。通过配置PyCharm插件、刷写MicroPython固件以及实战示例,帮助开发者快速上手嵌入式Python开发,显著提升物联网项目的开发效率。
基于C#的网络嗅探器的设计与实现
数据在网络上是以很小的称为帧(Frame)的单位传输的,帧由几部分组成,不同的部分执行不同的功能。帧通过特定的称为网络驱动程序的软件进行成型,然后通过网卡发送到网线上,通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。接收端机器的以太网卡捕获到这些帧,并告诉操作系统帧已到达,然后对其进行存储。就是在这个传输和接收的过程中,存在着安全方面的问题。每一个在局域网(LAN)上的工作站都有其硬件地址,这些地址唯一地表示了网络上的机器(这一点与Internet地址系统比较相似)。
2 海康视觉平台VisionMaster 上手系列:大纲及准备
海康视觉平台VisionMaster 大纲,课前准备 快速入门 工业机器视觉 机器视觉
网络嗅探器的设计与实现
本节将对本设计中用到的一些主要技术进行简单的介绍。2.2.1 C#语言简介C#是微软于2000年提出的一种源于C++、类似于Java的面向对象编程语言,适合于分布式环境中的组件开发。C# 是专门为.NET设计的,也是.NET编程的首选语言。C#的产生是因为微软在.NET上需要一种类Java的语言,而Java本身却不能胜任这一需求。C#太像C++了,以至于它很难给人带来体验新事物时的那种兴奋。不过,绝大部分的C++开发者将会因为C#保留了C++中大部分其喜欢的、强大的、令人激动的功能而选择使用它。
Langfuse实战:从评估打分到问题解决的完整指南
本文详细介绍了如何利用开源LLM工程平台Langfuse对AI应用进行系统性评估与优化。从创建评估数据集、设计自动化评分函数,到深入排查常见问题并关联Trace进行精准打分,提供了完整的实战指南。最后,探讨了如何利用评估结果驱动提示词迭代与A/B测试,并给出了生产环境部署与性能优化的关键考量,帮助开发者构建可测量、可分析、可改进的LLM应用。
SAR图像降噪:基于小波变换和双边滤波器的Matlab实现
小波变换和双边滤波器是常用的图像降噪技术,它们可以在保持图像细节的同时有效抑制噪声。本文介绍了基于小波变换和双边滤波器的SAR图像降噪方法,并提供了相应的Matlab源代码。通过对比原始图像和降噪后的图像,可以观察到噪声得到一定程度的抑制,同时保留了图像的细节信息。本文将介绍一种基于小波变换和双边滤波器的方法,用于SAR图像的降噪,并提供相应的Matlab源代码。希望这篇文章能够帮助您理解基于小波变换和双边滤波器的SAR图像降噪方法,并为您提供实现该方法的Matlab源代码。对图像的高频部分进行降噪处理。
Win7 英文专业版安装中文包汉化后部分软件中文乱码问题处理
按照本博客文章:Win7 专业版安装中文包、汉化处理 操作完毕,操作系统界面、office软件等都从英文变成了正常的中文。 但安装网上找的软件,比如网络嗅探器(影音神探)等软件时,菜单以及弹出窗口等等全部显示“?”,Google了一把,答案是更改: 控制面板 –> 区域和语言
Probability and Statistics - 4th edition
Probability and Statistics - 4th edition
HFS+cpolar组合实战:如何安全地在外网访问你的家庭NAS?
本文详细介绍了如何通过HFS+cpolar组合实现安全的外网访问家庭NAS方案。文章涵盖HFS服务器的用户权限管理、cpolar隧道的安全配置以及综合安全策略,帮助用户构建经济实惠且安全可靠的数据访问环境,特别适合对数据隐私有高要求的个人用户和小型团队。
WINCC7.3破解文件
WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!
visio安装包
Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。
socket阻塞与非阻塞,同步与异步
概念理解 一、与I/O相关的五个重要概念 第一个概念:用户空间与内核空间 1. 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方) 2. 操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。 3. 为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分:一部分为内核空间,一部分为用户空间 4. 针对linux操作系统而言,将最高的1G字节(从虚拟地
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
socket编程中的阻塞与非阻塞
通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞与非阻塞。所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待状态, 直到有东西可读或者可写为止。而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待。 在Tcp通信的例子中,很多时候就是采用的阻塞式的工作方式:当接收tcp
C# + Socket断线重连 整理
Socket 连接异常之"由于目标机器积极拒绝,无法连接(System.Net.Sockets.SocketException:Connection refused)" 1.如果是采用TCP/udp协议进行连接,检查windows防火墙是否开放相应SocketTCP/udp端口; 简单的检测方法是关闭windows防火墙后再试; 2.检查防火墙软件是否开放相应SocketTCP/udp端口; 简单的检测方法是关闭防火墙软件后再试; 3.如果服务器端和客户端均在本机上运行,则将相应的 serv...
在c#用raw socket进行sniff嗅探(一)
raw socket 三部曲:socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);socket.Bind(new IPEndPoint(IPAddress.Parse(IP), 0));同步下:rcv_size = socket.Receive(buffer);异步下:so
C#Socket(一)
C#Socket基础,欢迎来访!
C# 实现客户端Socket断开后重新连接。
思路:使用System.Threading.Timer类每秒检测一次是否连接,如果没有处于连接状态,则尝试连接一次,如果连接失败,则将异常信息捕捉,并记录日志,然后Sleep2秒,再尝试连接,一直重复连接的步骤。 System.Threading.Timer timer = null; private void BtnConnect_Click(object sender, RoutedEventArgs e) { timer = new Time
4562



被折叠的 条评论
为什么被折叠?



