C#基本网络操作

建档操作如ping,查询本机主机ip,同步异步查询局域网内主机,同步异步邮件发送等

1)ping

通过ping类测试网络

using System;
using System.Text;
using System.Net.NetworkInformation;

namespace PingExec
{
    class Program
    {
        static void Main(string[] args)
        {
            Ping ping = new Ping();
            PingOptions opt = new PingOptions();
            opt.DontFragment = true;

            string data = "aaaaaaaaaaaaaaa";
            byte[] buffer = Encoding.Default.GetBytes(data);
            int timeout = 120;
            PingReply replay = ping.Send("192.168.1.101", timeout, buffer, opt);
            string result = "";

            if(replay.Status==IPStatus.Success)
            {
                result = "Address:{0}\r\nRoundTrip time:{1}\r\nTime to live:{2}\r\nDont fragment:{3}\r\n" +
                    "Buffer size:{4}";
                string str = string.Format(result, replay.Address.ToString(), replay.RoundtripTime, replay.Options.Ttl,
                    replay.Options.DontFragment, replay.Buffer.Length);
                Console.WriteLine(str);
            }
            Console.ReadKey();
        }
    }
}

2)查询本机ip与主机名

using System;
using System.Net;
using System.Diagnostics;
using System.Net.Sockets;

(一)通过Process类调用ipconfig.exe

        public static string GetIp()
        {
            Process cmd = new Process();
            cmd.StartInfo.FileName = "ipconfig.exe";//设置程序名
            cmd.StartInfo.Arguments = "/all";  //参数     

            cmd.StartInfo.RedirectStandardOutput = true;
            cmd.StartInfo.RedirectStandardInput = true;
            cmd.StartInfo.UseShellExecute = false;
            cmd.StartInfo.CreateNoWindow = true;//不显示窗口(控制台程序是黑屏)     

            cmd.Start();
            string info = cmd.StandardOutput.ReadToEnd();
            cmd.WaitForExit();
            cmd.Close();
            return info;
        }

(二)通过DNS类获取

       static string GetLocalIp()
        {
            try
            {
                string HostName = Dns.GetHostName(); //得到主机名
                IPHostEntry IpEntry = Dns.GetHostEntry(HostName);
                for (int i = 0; i < IpEntry.AddressList.Length; i++)
                {
                    //从IP地址列表中筛选出IPv4类型的IP地址
                    //AddressFamily.InterNetwork表示此IP为IPv4,
                    //AddressFamily.InterNetworkV6表示此地址为IPv6类型
                    if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
                    {
                        return IpEntry.AddressList[i].ToString();
                    }
                }
                return "";
            }
            catch (Exception ex)
            {
               // MessageBox.Show("获取本机IP出错:" + ex.Message);
                return "";
            }
        }
IpEntry.AddressList中包含所有ip,包括ip6,ip4(包括无线Ip4)

3)搜索局域网内可ping通的主机

搜索网段范围内所有Ip并测试。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Text;

(一)非异步操作

       public static void SearchIP()
        {
            List<string> ipList = new List<string>();
            //获取本地机器名
            string myHostName = Dns.GetHostName();
            //获取本机IP
            string myHostIP = Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault<IPAddress>(a => a.AddressFamily.ToString().Equals("InterNetwork")).ToString();
            Console.WriteLine(myHostIP);
            //截取IP网段
            string ipDuan = myHostIP.Remove(myHostIP.LastIndexOf(‘.‘));
            //MessageBox.Show(ipDuan);
            //枚举网段计算机
            Ping myPing = new Ping();
            string pingData = "aaaaaaaaaaaa";
            byte[] buffer = Encoding.ASCII.GetBytes(pingData);
            for (int i = 1; i <= 255; i++)
            {
                string pingIP = ipDuan + "." + i.ToString();
                PingReply pingReply = myPing.Send(pingIP, 120, buffer);
                if (pingReply.Status == IPStatus.Success)
                {
                    ipList.Add(pingIP);
                    //Console.Write("答复的主机地址:" + pingReply.Address.ToString() + "  ");
                    //Console.Write("往返时间:" + pingReply.RoundtripTime.ToString() + "  ");
                    //Console.Write("生存时间:" + pingReply.Options.Ttl.ToString() + "  ");
                    //Console.Write("是否控制数据包的分段:" + pingReply.Options.DontFragment.ToString() + "  ");
                    //Console.Write("缓冲区大小:" + pingReply.Buffer.Length.ToString() + "  ");
                    Console.WriteLine(pingIP);
                }
                Console.WriteLine("------------------" + i.ToString());
            }
        }

(二)异步操作

       public static void SearchIPAnsyc()
        {
            try
            {
                for (int i = 1; i <= 255; i++)
                {
                    Ping myPing = new Ping();
                    myPing.PingCompleted += new PingCompletedEventHandler(PingCompletedAction);

                    string pingIP = "192.168.1." + i.ToString();
                    myPing.SendAsync(pingIP, 2000, null);
                    Console.WriteLine("------------------" + i.ToString());
                }
            }
            catch
            {

            }
        }

        private static void PingCompletedAction(object sender, PingCompletedEventArgs e)
        {
            List<string> ipList = new List<string>();
            if (e.Reply.Status == IPStatus.Success)
            {
                  ipList.Add(e.Reply.Address.ToString());
                  Console.Write(e.Reply.Address.ToString());
                Console.WriteLine("Ansyc-----------------------");
            }
           // Console.WriteLine("Ansyc-----------------------");
        } 

4)通过 SmtpClient类发送电子邮件

using System;
using System.ComponentModel;
using System.Net.Mail;
using System.Text;

首相通过MailMessage添加邮件发送信息,包括主题,内容,附件等。其中附件通过Attachment类添加。

MailMessage类主题

           string sendMail= "********@163.com";
            string sendPwd = "*********";

            MailAddress mailAddress = new MailAddress(sendMail);
            MailMessage mailMessage = new MailMessage();

            mailMessage.To.Add("*******@qq.com");//添加发送地址,可添加多个
            //mailMessage.CC.Add("[email protected]");//添加抄送地址
            mailMessage.From = mailAddress;
            mailMessage.Subject = "test";//主题
            mailMessage.SubjectEncoding = Encoding.UTF8;
            mailMessage.Body = "测试邮件";//正文
            mailMessage.BodyEncoding = Encoding.Default;//正文的编码
            mailMessage.Priority = MailPriority.High;
            mailMessage.IsBodyHtml = true;

            //添加附件
            string[] attachments = new string[] { @"E:\C#\PingExec\NetHostSearch\bin\Debug\00.jpg" };
            try
            {
                if(attachments.Length>0)
                {
                    foreach(string attach in attachments)
                    {
                        Attachment attachment = new Attachment(attach);
                        mailMessage.Attachments.Add(attachment);
                        Console.WriteLine("Attach success");
                    }
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine("Attach failed"+ex.Message);
            }

定义发送协议

            //定义发送协议
            SmtpClient smtpClient = new SmtpClient();
            smtpClient.Credentials= new System.Net.NetworkCredential(sendMail, sendPwd);
            smtpClient.Host= "smtp.163.com";
smtpClient.Host对于不同的网址邮箱服务器不一样,比如扣扣邮箱则为"smtp.qq.com"

(一)同步发送

            try
            {
                smtpClient.Send(mailMessage);
                Console.WriteLine("Success");
            }
            catch (SmtpException ex)
            {
                Console.WriteLine("Failed:" + ex.Message);
            }
            mailMessage.Dispose();

(二)异步发送

            //异步发送  也可以用SendMailAsync 其返回值为task,既可以调用task的continWith方法
            smtpClient.SendCompleted += SendCompletedAction;
            smtpClient.SendAsync(mailMessage,null);
            Console.ReadKey();

异步发送 结束后调用SendCompletedAction,其定义如下

        private static void SendCompletedAction(object sender, AsyncCompletedEventArgs e)
        {
            String token = (string)e.UserState;
            if (e.Cancelled)
            {
                Console.WriteLine("[{0}] Send canceled.", token);
            }
            if (e.Error != null)
            {
                Console.WriteLine("[{0}] {1}", token, e.Error.ToString());
            }
            else
            {
                Console.WriteLine("Message sent.");
            }
        }

发送邮件为了便于理解在此进行了分步分割,一下为完整代码,其中同步发送方法已注释:

using System;
using System.ComponentModel;
using System.Net.Mail;
using System.Text;

namespace MailSendMgr
{
    class Program
    {
        static void Main(string[] args)
        {
            string sendMail= "***********@163.com";
            string sendPwd = "*************";

            MailAddress mailAddress = new MailAddress(sendMail);
            MailMessage mailMessage = new MailMessage();

            mailMessage.To.Add("************@qq.com");//添加发送地址,可添加多个
            //mailMessage.CC.Add("[email protected]");//添加抄送地址
            mailMessage.From = mailAddress;
            mailMessage.Subject = "test";//主题
            mailMessage.SubjectEncoding = Encoding.UTF8;
            mailMessage.Body = "测试邮件";//正文
            mailMessage.BodyEncoding = Encoding.Default;//正文的编码
            mailMessage.Priority = MailPriority.High;
            mailMessage.IsBodyHtml = true;

            //添加附件
            string[] attachments = new string[] { @"E:\C#\PingExec\NetHostSearch\bin\Debug\00.jpg" };
            try
            {
                if(attachments.Length>0)
                {
                    foreach(string attach in attachments)
                    {
                        Attachment attachment = new Attachment(attach);
                        mailMessage.Attachments.Add(attachment);
                        Console.WriteLine("Attach success");
                    }
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine("Attach failed"+ex.Message);
            }

            //定义发送协议
            SmtpClient smtpClient = new SmtpClient();
            smtpClient.Credentials= new System.Net.NetworkCredential(sendMail, sendPwd);
            smtpClient.Host= "smtp.163.com";

            //发送
            //try
            //{
            //    smtpClient.Send(mailMessage);
            //    Console.WriteLine("Success");
            //}
            //catch (SmtpException ex)
            //{
            //    Console.WriteLine("Failed:" + ex.Message);
            //}
            //mailMessage.Dispose();

            //异步发送  也可以用SendMailAsync 其返回值为task,既可以调用task的continWith方法
            smtpClient.SendCompleted += SendCompletedAction;
            smtpClient.SendAsync(mailMessage,null);
            Console.ReadKey();
        }

        private static void SendCompletedAction(object sender, AsyncCompletedEventArgs e)
        {
            String token = (string)e.UserState;
            if (e.Cancelled)
            {
                Console.WriteLine("[{0}] Send canceled.", token);
            }
            if (e.Error != null)
            {
                Console.WriteLine("[{0}] {1}", token, e.Error.ToString());
            }
            else
            {
                Console.WriteLine("Message sent.");
            }
        }
    }
}
时间: 2024-11-10 14:44:23

C#基本网络操作的相关文章

android之网络操作(1)

一.网络操作 在网络操作中JAVA已经为我提供了一套API用来进行网络操作,在android开发中我们仍可以这套API来做开发.下面通过一个简单的例子来了解一下android下的网络操作. 点击图中下载按钮从服务器上下载一张图片下来 二.xml布局文件 布局文件采用线性布局,只使用到一个button和一个image <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=

【iOS】网络操作与AFNetworking

众所周知.苹果搞的一套框架NSContention发送请求与接收请求的方式十分繁琐.操作起来非常不方便. 不仅要做区分各种请求设置各种不同的參数,并且还要常常在多线程里操作,同一时候还要对请求与返回的数据做各种序列化的操作.同一时候还要考虑请求数据的安全等一堆问题. 一.早前的几个网络框架 1.ASI框架: HTTP终结者.非常牛, 可是有BUG, 已经停止更新. 2.MKNetworkKit (印度人写的). 3.AFN一直还在更新. AFNetworking的出现:MAC/iOS设计的一套网

网络操作不能直接写在主线程中 以及 为什么不能在子线程中更新UI控件的属性

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //注意: 所有网络操作不能直接写在主线程中 因为所有的网络操作都是耗时的,如果加载到主线程中,会导致与用户的交互出现问题 ,所以要加载到子线程中 // [self loadImage]; [self performSelectorInBackground:@selector(loadImage) withObject:nil]; } //加

Android网络操作的几种方法

安卓开发软件:AndroidStudio 服务器软件:Myeclipse+Tomcat 首先无论是哪种方式,安卓手机软件要想联网,必须要申请联网权限(android.permission.INTERNET). 安卓主线程不允许做耗时操作(联网操作就是一种耗时操作),所以下面的的网络操作都是通过内部匿名类另起的一个线程操作的. 一,第一种方式:使用HttpURLConnection进行联网操作 这个方法需要我们手动构建一个http请求包,发送到指定的服务器 get方式 设置URL 打开连接 设置请

android内部培训视频_第四节(1)_异步网络操作

第四节(1):异步网络操作  一.结合asyncTask下载网络图片 1.定义下载类,继承自asyncTask,参数分别为:String(url地址),Integer(刻度,本例没有用到),BitMap(下载成功后的图片) public class downloadImageTask extends AsyncTask<String, Integer, Bitmap> { /** * 在线程开始之前执行 */ @Override protected void onPreExecute() {

(原创)在service中定时执行网络操作的几点说明

执行网络操作是耗时操作,即便是在service中也要放到子线程中执行 这里我用到了async-http-client框架来执行异步请求操作 计时用的java原生Timer和TimerTask类 本来这两者分开操作各没有问题 但是如果把异步操作写到TimerTask的run方法里就会出错 E/AndroidRuntime(5799): java.lang.IllegalArgumentException: Synchronous ResponseHandler used in AsyncHttpC

Android官方开发文档Training系列课程中文版:网络操作之网络连接

原文地址:http://android.xsoftlab.net/training/basics/network-ops/index.html 引言 这节课将会学习最基本的网络连接,监视网络连接状况及网络控制等内容.除此之外还会附带描述如何解析.使用XML数据. 这节课所包含的示例代码演示了最基本的网络操作过程.开发者可以将这部分的代码作为应用程序最基本的网络操作代码. 通过这节课的学习,将会学到最基本的网络下载及数据解析的相关知识. Note: 可以查看课程Transmitting Netwo

[New learn] 网络基础-网络操作

代码:https://github.com/xufeng79x/NETOperation 1.简介 主要记录基本的网络操作步骤,get/post关系和区别和文件上传实现. 2.准备 需要服务器端,如果你没有完成服务器端的操作请参考[New learn] 网络基础-apache本地服务搭建(支持php) 3.网络基本操作 3.1.基本操作步骤 //step_1:创建URL //step_2:创建request //step_3:建立连接接受返回数据 //step_4:反序列化数据 举例:如下我们将

九、Android学习第八天——广播机制与WIFI网络操作(转)

(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 九.Android学习第八天——广播机制与WIFI网络操作 今天熟悉了Android中的广播机制与WIFI网络的一些基本操作,总结如下: Android的广播机制 我们知道广播机制中,发送方不会关心接收方时候接收到数据或者如何去处理数据. 这里总结下Android中BroadcastReceiver的注册方法: (一)在应用程序中进行注册 (二)在Manifest.xml

Android之旅十五 android中的网络操作

android中的网络操作和java里面没有什么区别,java里面的很多网络操作方法都可以搬到android中去使用,主要几个点: 1.post和get请求的区别,大家可以在网上查阅有关资料进行了解,get主要以向地址中拼接字符串参数发送到服务器,长度有限制,并且请求参数暴露在地址栏中,不怎么安全:post则主要是将请求参数转换为相应的http协议请求体发送到服务器,相比get方式,参数的长度没有限制,并且参数信息不会暴露给用户: 2.我们在java web里面通过浏览器以post方式发送数据,