出错,一出错就得重新输入,而且还不能像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);
造成“减损”的原因 :衰减(采用中继器), 时延失真 ,噪声
五计算数据速率极值
六 性能指标