PDA

View Full Version : سوال: دریافت بسته ها یک کارت شبکه و ارسال آن به یک کارت شبکه دیگر



20972097
یک شنبه 30 آذر 1393, 09:35 صبح
سلام، روی سیستم من دو کارت شبکه وجود داره و من می خوام یه برنامه با سی شارپ بنویسم که بسته هایی را که از کارت شبکه اول عبور می کند را بردارم و بدون تغییر ( یعنی آدرس فرستنده و گیرنده، حجم داده و... تغییر نکند ) آنها را به کارت شبکه دوم ارسال کنم. من برنامه ای رو نوشتم که بسته هایی را که از کارت شبکه اول عبور می کند را برمیدارد ولی هر کاری کردم نتونستم برنامه ای رو بنویسم که این بسته ها رو به کارت شبکه دوم ارسال کند.من سورس برنامه ای را که نوشتم در زیر قرار دادم،ممنون میشم از کسی که بتونه به من کمک کنه.
با تشکر
private Socket mainSocket;
private byte[] byteData = new byte[4096];
private bool bContinueCapturing = false;

private delegate void AddTreeNode(TreeNode node);

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
string strIP = null;

IPHostEntry HosyEntry = Dns.GetHostEntry((Dns.GetHostName()));
if (HosyEntry.AddressList.Length > 0)
{
foreach (IPAddress ip in HosyEntry.AddressList)
{
strIP = ip.ToString();
cmbInterfaces.Items.Add(strIP);
}
}
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (bContinueCapturing)
{
mainSocket.Close();
}
}

private void btnStart_Click(object sender, EventArgs e)
{

if (cmbInterfaces.Text == "")
{
MessageBox.Show("Select an Interface to capture the packets.", "MJsniffer",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
try
{
if (!bContinueCapturing)
{

btnStart.Text = "&Stop";

bContinueCapturing = true;

mainSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Raw, ProtocolType.IP);

mainSocket.Bind(new IPEndPoint(IPAddress.Parse(cmbInterfaces.Text), 0));

mainSocket.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.HeaderIncluded,
true);

byte[] byTrue = new byte[4] { 1, 0, 0, 0 };
byte[] byOut = new byte[4] { 1, 0, 0, 0 };

mainSocket.IOControl(IOControlCode.ReceiveAll,
byTrue,
byOut);

mainSocket.Receive(byteData);

mainSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
}
else
{
btnStart.Text = "&Start";
bContinueCapturing = false;
mainSocket.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "sniffer", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

private void OnReceive(IAsyncResult ar)
{

try
{

int nReceived = mainSocket.EndReceive(ar);

if (bContinueCapturing)
{
byteData = new byte[4096];
mainSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None,
new AsyncCallback(OnReceive), null);
}
}
catch (ObjectDisposedException)
{
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "sniffer", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

}

silsin
چهارشنبه 10 دی 1393, 22:50 عصر
قبل از پاسخ می تونم سوال کنم چرا این کار رو می خواین انجام بدین ؟

20972097
پنج شنبه 11 دی 1393, 05:48 صبح
قبل از پاسخ می تونم سوال کنم چرا این کار رو می خواین انجام بدین ؟

من این رو میدونم که ویندوز این کار رو انجام میده ولی من میخوام روی بسته ها یکسری پردازش یا فیلتر اعمال کنم.