出错,一出错就得重新输入,而且还不能像CMD命令一样,可以通过方向键回到之前的输入。在痛苦了多次后,决定做一个类似Telnet功能的
模拟工具,更确切的说是基于SOCKET的网络通信工具,以便更好的进行SMTP/POP3/IMAP的测试。实现在的关键代码如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using UtilSp.ClassLib; using System.Linq.Expressions; using System.Threading; namespace SocketLink { public partial class FormMain : Form { public FormMain() { InitializeComponent(); } private Socket socket_ = null; private Helper helper_ = new Helper();//In order to automatically update data to UI with binding property. private int receiveLen_max_ = 0xFFFF; private Thread receiveThread_ = null; private Encoding receiveEncoding_ = Encoding.UTF8; private bool needConvertBase64Received_ = false; private string lineBreak_ = "\r\n"; private void buttonConnect_Click(object sender, EventArgs e) { try { string host = textBoxHost.Text; string port = textBoxPort.Text; if (string.IsNullOrEmpty(host)) { showMessage(Tip.hostEmpty); return; } if (string.IsNullOrEmpty(port)) { showMessage(Tip.portEmpty); return; } if (!IpPortSp.isPort(port)) { MessageBox.Show(Tip.portIllegal); return; } socket_ = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket_.Connect(host, Convert.ToInt32(port)); if (!socket_.Connected) { showBackInfo(Tip.connectFail); return; } receiveThread_ = new Thread(receiveCallBack);//Create thread to listen receive from socket. receiveThread_.IsBackground = true; receiveThread_.Start(); helper_.connectEnabled_pro = false; helper_.disconnectEnabled_pro = true; helper_.sendEnabled_pro = true; showBackInfo(Tip.connectOK); } catch (System.Exception ex) { showBackInfo(ex.Message); } } private void showMessage(string message) { MessageBox.Show(message); } private void showBackInfo(string backInfo, bool isNeedInvoke = false) { if (isNeedInvoke) { this.Invoke((Action)(() => { helper_.backInfo_pro += backInfo + "\r\n"; })); } else { helper_.backInfo_pro += backInfo + "\r\n"; } } public class Helper : INotifyPropertyChanged //Automatically update UI data class { #region backInfo Property private string backInfo_ = ""; public string backInfo_pro { get { return backInfo_; } set { if (value == backInfo_) { return; } backInfo_ = value; NotifyPropertyChanged(() => backInfo_pro); } } #endregion #region connectEnabled Property private bool connectEnabled_ = true; public bool connectEnabled_pro { get { return connectEnabled_; } set { if (value == connectEnabled_) { return; } connectEnabled_ = value; NotifyPropertyChanged(() => connectEnabled_pro); } } #endregion #region backInfo NotifyPropertyChanged public void NotifyPropertyChanged<T>(Expression<Func<T>> property) { if (PropertyChanged == null) { return; } var memberExpression = property.Body as MemberExpression; if (memberExpression == null) { return; } PropertyChanged.Invoke(this, new PropertyChangedEventArgs(memberExpression.Member.Name)); } public event PropertyChangedEventHandler PropertyChanged; #endregion #region disconnectEnabled Property private bool disconnectEnabled_ = false; public bool disconnectEnabled_pro { get { return disconnectEnabled_; } set { if (value == disconnectEnabled_) { return; } disconnectEnabled_ = value; NotifyPropertyChanged(() => disconnectEnabled_pro); } } #endregion #region sendEnabled Property private bool sendEnabled_ = false; public bool sendEnabled_pro { get { return sendEnabled_; } set { if (value == sendEnabled_) { return; } sendEnabled_ = value; NotifyPropertyChanged(() => sendEnabled_pro); } } #endregion } private void FormMain_Load(object sender, EventArgs e) { initializeUI(); binding(); } private void binding()//Binding property with helper_ and automatically update data. { textBoxInfo.DataBindings.Add("Text", helper_, "backInfo_pro"); buttonConnect.DataBindings.Add("Enabled", helper_, "connectEnabled_pro"); buttonDisconnect.DataBindings.Add("Enabled", helper_, "disconnectEnabled_pro"); buttonSend.DataBindings.Add("Enabled", helper_, "sendEnabled_pro"); } private void initializeUI() { comboBoxSendEncoding.SelectedIndex = 2; comboBoxReceiveEncoding.SelectedIndex = 2; } private void buttonDisconnect_Click(object sender, EventArgs e) { try { if (socket_ == null) { return; } socket_.Close(); if (socket_ == null) { this.showBackInfo(Tip.disconnectFail); } else { helper_.connectEnabled_pro = true; helper_.disconnectEnabled_pro = false; helper_.sendEnabled_pro = false; this.showBackInfo(Tip.disconnectOK); } } catch (System.Exception ex) { this.showBackInfo(ex.Message); } } private void buttonSend_Click(object sender, EventArgs e) { try { string sendStr = textBoxSendData.Text; if (string.IsNullOrEmpty(sendStr)) { showBackInfo(Tip.sendDataEmpty); return; } if (!socket_.Connected) { showBackInfo(Tip.notConnect); return; } showBackInfo(Tip.sending); string sendEncodingName = comboBoxSendEncoding.Text; if (string.IsNullOrEmpty(sendEncodingName)) { showBackInfo(Tip.sendEncodingEmpty); return; } string receiveEncodingName = comboBoxReceiveEncoding.Text; if (string.IsNullOrEmpty(receiveEncodingName)) { showBackInfo(Tip.receiveEncodingEmpty); return; } Encoding sendEncoding = Encoding.GetEncoding(sendEncodingName); receiveEncoding_ = Encoding.GetEncoding(receiveEncodingName); sendStr += checkBoxAutoAddLineBreak.Checked ? lineBreak_ : "";//Automaticall add line break.SMTP/POP3/IMAP need. byte[] sendData = null; if (checkBoxToBase64.Checked) { sendData = Base64Sp.tobase64Bytes(sendStr, sendEncoding); } else { sendData = sendEncoding.GetBytes(sendStr); } socket_.Send(sendData); showBackInf
Linux目录结构是Linux学习者必须了解的知识,Linux的目录与Windows又有很大的不同,所以搞清楚Linux目录结构是关键。
(部分转自ChinaBytel)
linux有四种基本文件系统类型:普通文件、目录文件、连续文件和特殊文件。可以用file命令来识别。
普通文件:如文本文件、c语言源代码、shell脚本等,可以用cat、less、more、vi等来察看内容,用mv来改名。
目录文件:包括文件名、子目录名及其指针。可以用ls列出目录文件
链接文件:是指向一索引节点的那些目录条目,用ls来查看时,链接文件的标志用l开头,而文件后以"->"指向所链接的文件
特殊文件:如磁盘、终端、打印机等都在文件系统中表示出来,常放在/etc目录内。例如:软驱A称为/dev/fd0,/dev/had来自第一硬 盘。
. / /目录也称为根目录,位于linux文件系统目录结构的顶层。在很多系统中的唯一分区。如果还有其他分区,必须挂在到/目录下某个位置。整个目录结构呈树型结构,因此也称为目录树。 2. bin bin目录为命令文件目录,也称为二进制目录。包含了供系统管理员及普通用户使用的重要的linux命令和二进制(可执行)文件,包含shell解释器等,该目录不能包含子目录。 3. boot boot目录,该目录中存放系统的内核文件和引导装载程序文件。例如:RHEL5的内核文件:vmlinuz-2.6.18-8.el5xen。 4. dev dev目录,也称设备(device)文件目录,存放连接到计算机上的设备(终端、磁盘驱动器、光驱及网卡等)的对应文件,包括字符设备和块设备等。 5. etc etc目录存放系统的大部分配置文件和子目录。X Window系统的文件保存在/etc/X11子目录中,与网络有关的配置文件保存在/etc/sysconfig子目录中。该目录下的文件由系统管理员来使用,普通用户对大部分文件有只读权限。 6. home home目录中包含系统上各个用户的主目录,子目录名称即为各用户名。 7. lib lib目录下存放了各种编程语言库。典型的linux系统包含了C、C++和FORTRAN语言的库文件。用好这些语言开发的应用程序可以是使用这些库文件。这就使软件开发者能够利用那些预先写好并测试过的函数。/lib目录下的库映像文件可以用来启动系统并执行一些命令。目录/lib/modules包含了可加载的内核模块。/lib目录存放了所有重要的库文件,其他的库文件爱你则大部分存放在/usr/lib目录下。 8. lost+found lost+found目录,在EXT2或EXT3文件系统中,当系统意外崩溃或机器意外关机,产生的一些文件碎片放在这里。在系统启动的过程中fsck工具会检查这里,并修复已经损坏的文件系统。有时系统发生问题,有很多的文件被移到这个目录中,可能会用手工的方法来修复,或者移动文件到运来的位置上。 9. opt opt目录表示的是可选择的意思,有些软件包也会被安装在这里,某些第三方应用程序通常安装在这个目录。 10. root root目录为系统管理员的主目录。 11. usr usr目录是linnux系统中最大的系统之一,很多系统中,该目录是最为独立分区挂载的。该目录中主要存放不经常变化的数据,以及系统下安装的应用程序目录。 12. mnt mnt目录主要用来临时挂载文件系统,为某些设备提供默认挂载点,如floppy,cdrom。这样当挂载了一个设备如光驱时,就可以通过访问目录/mnt/cdrom下的文件来访问相应的光驱上的文件了。 13. proc proc目录是一个虚拟的文件系统,该目录中的文件是内存中过的映像。可以通过查看该目录中的文件过去有关系统硬件运行的详细信息,例如使用more或者less命令查看/proc/interrupts文件以获取硬件中断(IRQ)信息,查看/proc/cpuinfo文件以获取CPU的型号、主频等信息。 14. sbin sbin目录下保存系统管理员或者root用户的命令文件。/usr/sbin存放了应用软件,/usr/local/sbin存放了通用的根用户权限的命令。 . / /目录也称为根目录,位于linux文件系统目录结构的顶层。在很多系统中的唯一分区。如果还有其他分区,必须挂在到/目录下某个位置。整个目录结构呈树型结构,因此也称为目录树。 2. bin bin目录为命令文件目录,也称为二进制目录。包含了供系统管理员及普通用户使用的重要的linux命令和二进制(可执行)文件,包含shell解释器等,该目录不能包含子目录。 3. boot boot目录,该目录中存放系统的内核文件和引导装载程序文件。例如:RHEL5的内核文件:vmlinuz-2.6.18-8.el5xen。 4. dev dev目录,也称设备(device)文件目录,存放连接到计算机上的设备(终端、磁盘驱动器、光驱及网卡等)的对应文件,包括字符设备和块设备等。 5. etc etc目录存放系统的大部分配置文件和子目录。X Window系统的文件保存在/etc/X11子目录中,与网络有关的配置文
一 模拟与数字
1. 数据:各种需要传输和处理的信息(文字,图像、声音、动作等)。
模拟数据:具有可连续变化的值,通常用各种测量单位表示(时间、身高、体重、温度、教师上课的声音等)
数字数据:具有离散值且可以计数的(听课同学的人数,教室电灯开关的状态等)
2. 信号:数据的电气或电磁表示方式
模拟信号:信号波形随时间连续变化;
数字信号:瞬时跳变直方形;
二 周期模拟信号
1. 正弦波
2. 傅里叶分析:任何电磁信号都可以看做是由不同频率成分组成,即由一组不同振幅、频率和相位的正弦波构造而成(叠加)。
傅立叶分析使用的两种技术
傅里叶变换:用于非周期性信号
傅里叶级数: 用于周期性信号
3. 频谱与带宽
信号的频谱:信号所包含的频率范围;
带宽:频谱的宽度(最高频率减最低频率);
三 数字信号
1. 二进制信号
比特率用来反映数字信号的数据传输速率,即每秒传送的比特数(二进制数位数),单位:bps (b/s) 或 Mbps;
在计算机网络传输中,所需带宽与比特率成正比;更高比特率要求更高的带宽;
2. 基带传输
3.宽带传输
四 传输减损
传输减损:收方收到的信号与发送方发送的信号不相同。
对模拟信号,主要表现为信号品质下降;
对数字信号,主要表现为产生位错(比特反置,即 0 → 1 或 1 → 0);
造成“减损”的原因 :衰减(采用中继器), 时延失真 ,噪声
五计算数据速率极值
六 性能指标