最近在折腾网络方面的通讯协议,每次熟悉协议的时候,总是习惯用telnet来测试,但是在测试的过程中,很纠结的是,有的地方输入不能
出错,一出错就得重新输入,而且还不能像CMD命令一样,可以通过方向键回到之前的输入。在痛苦了多次后,决定做一个类似Telnet功能的
出错,一出错就得重新输入,而且还不能像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";