此为资源整理价格,不提供任何技术支持,不包安装。新手不要买!
源码仅供研究学习代码使用,严禁用于非法和商业用途!如需商业用途请去购买官方正版源码!
只适用于老手和技术大神!发货后谢绝退款行为!
【源码介绍】
通过端口转发,协议透传,记录通讯协议日志
【源码截图】
【源码示例】
#region 私有变量定义
/// <summary>
/// 服务端
/// </summary>
private TcpPullServer _serverSocket;
/// <summary>
/// 客户端
/// </summary>
private TcpPullClient _clientSocket;
/// <summary>
/// 连接的客户端IP地址
/// </summary>
private string netClientAddress;
/// <summary>
/// 连接的客户端端口号
/// </summary>
private int netClientPort;
/// <summary>
/// 网络是否连接成功
/// </summary>
private bool _isClientNet;
/// <summary>
/// 连接的客户端
/// </summary>
private List<IntPtr> _clientSockeList;
#endregion
public MainForm()
{
InitializeComponent();
_clientSockeList = new List<IntPtr>();
}
#region TCP服务连接
private HandleResult ServerErrors(IntPtr connId, SocketOperation enOperation, int errorCode)
{
if (errorCode <= 0) throw new ArgumentOutOfRangeException(nameof(errorCode));
_serverSocket?.Disconnect(connId);
return HandleResult.Ok;
}
private HandleResult ServerSocketAccept(IntPtr connId, IntPtr pClient)
{
_clientSockeList.Add(connId);
string clientIp = string.Empty;
ushort clientPort = 0;
_serverSocket.GetRemoteAddress(connId, ref clientIp, ref clientPort);
ShowNetDataMsg("客户端TCP连接", 0, $"连接地址:{clientIp},端口:{clientPort}");
return HandleResult.Ok;
}
private HandleResult ServerSocketClose(IntPtr connId)
{
foreach (var item in _clientSockeList)
{
if (item == connId)
{
_clientSockeList.Remove(item);
break;
}
}
return HandleResult.Ok;
}
private HandleResult ServerRecvData(IntPtr connId, int length)
{
if (length >= 1)
{
IntPtr bufferPtr = Marshal.AllocHGlobal(length);
try
{
if (_serverSocket.Fetch(connId, bufferPtr, length) == FetchResult.Ok)
{
var recvBytes = ConvertHelper.IntptrToBytes(bufferPtr, length);
string recvString = ConvertHelper.BytesToHex(recvBytes);
var ip = string.Empty;
ushort port = 0;
_serverSocket.GetRemoteAddress(connId, ref ip, ref port);
ShowNetDataMsg($"接收,IP:{ip},端口:{port}", length, recvString);
if (!_isClientNet)
{
if (!string.IsNullOrEmpty(netClientAddress) && netClientPort > 0)
{
_isClientNet = _clientSocket.Connetion(netClientAddress, (ushort)netClientPort);
}
}
_clientSocket.GetListenAddress(ref ip, ref port);
_clientSocket.Send(recvBytes, length);
ShowNetDataMsg($"发送,IP:{ip},端口:{port}", length, recvString);
}
}
finally
{
if (bufferPtr != IntPtr.Zero)
{
Marshal.FreeHGlobal(bufferPtr);
}
}
}
return HandleResult.Ok;
}
private HandleResult ServerSocketShutdown()
{
_isClientNet = false;
return HandleResult.Ok;
}
#endregion
#region TCP/IP客户端连接
/// <summary>
/// 与服务端成功建立连接时,Socket 监听器将收到该通知
/// </summary>
/// <param name="sender">The sender.</param>
/// <returns></returns>
protected HandleResult OnConnect(TcpClient sender)
{
_isClientNet = true;
string serverIp = string.Empty;
ushort serverPort = 0;
_clientSocket.GetListenAddress(ref serverIp, ref serverPort);
ShowNetDataMsg("服务端TCP连接", 0, $"连接地址:{serverIp},端口:{serverPort}");
return HandleResult.Ok;
}
private HandleResult ClientErrors(TcpClient sender, SocketOperation enOperation, int errorCode)
{
if (errorCode <= 0) throw new ArgumentOutOfRangeException(nameof(errorCode));
sender.Stop();
return HandleResult.Ok;
}
private HandleResult ClientRecvData(TcpPullClient sender, int length)
{
if (length >= 5)
{
IntPtr bufferPtr = Marshal.AllocHGlobal(length);
try
{
if (sender.Fetch(bufferPtr, length) == FetchResult.Ok)
{
var recvBytes = ConvertHelper.IntptrToBytes(bufferPtr, length);
string recvString = ConvertHelper.BytesToHex(recvBytes);
var ip = string.Empty;
ushort port = 0;
sender.GetListenAddress(ref ip, ref port);
ShowNetDataMsg($"接收,IP:{ip},端口:{port}", length, recvString);
if (_clientSockeList.Count > 0)
{
foreach (var item in _clientSockeList)
{
_serverSocket.GetRemoteAddress(item, ref ip, ref port);
_serverSocket.Send(item, recvBytes, length);
ShowNetDataMsg($"发送,IP:{ip},端口:{port}", length, recvString);
}
}
}
}
finally
{
if (bufferPtr != IntPtr.Zero)
{
Marshal.FreeHGlobal(bufferPtr);
}
}
}
return HandleResult.Ok;
}
#endregion
//将信息显示到UI线程的方法
private void ShowNetDataMsg(string state, int dataLen, string dataMsg)
{
NetRecviceMsg.BeginInvoke((MethodInvoker)delegate
{
var msgList = new StringBuilder();
msgList.Append($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} {state},数据长度:{dataLen}\r\n");
msgList.Append($"数据内容:{dataMsg}\r\n");
NetRecviceMsg.AppendText(msgList.ToString());
if (NetRecviceMsg.Lines.GetUpperBound(0) >= 3000)
{
LogHelper.WriteLog(NetRecviceMsg.Text);
NetRecviceMsg.Clear();
}
});
}
#region 文本框处理
/// <summary>
/// 只允许键盘输入数字
/// 不包括“-”号
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void IntBackspace_KeyPress(object sender, KeyPressEventArgs e)
{
string pa = "[0-9]|\b"; //匹配数字与退格符
Regex r = new Regex(pa);
Match m = r.Match(e.KeyChar.ToString());
if (m.Success)
e.Handled = false;
else
{
e.Handled = true;
}
}
/// <summary>
/// 只允许键盘输入数字
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void KeyBoardInt_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = true;
if ((e.KeyChar >= '0' && e.KeyChar <= '9') || (e.KeyChar == (char)8) || (e.KeyChar == '-'))
e.Handled = false;
}
/// <summary>
/// 允许键盘输入小数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <param name="wei">小数位数</param>
protected void KeyBoardFloat_KeyPress(object sender, KeyPressEventArgs e, int wei)
{
if (char.IsNumber(e.KeyChar) || e.KeyChar == '.' || e.KeyChar == (char)Keys.Back ||
e.KeyChar == (char)Keys.Delete)
{
e.Handled = false; //让操作生效
int j = 0;
int k = 0;
bool flag = false;
if (((TextBox)sender).Text.Length == 0)
{
if (e.KeyChar == '.')
{
e.Handled = true; //让操作失效
}
}
int pPos = 0; //小数点位置
for (int i = 0; i < ((TextBox)sender).Text.Length; i )
{
if (((TextBox)sender).Text[i] == '.')
{
j ;
pPos = ((TextBox)sender).Text.IndexOf('.'); //获取当前小数点位置
flag = true;
}
if (flag)
{
if (char.IsNumber(((TextBox)sender).Text[i]) &&
(e.KeyChar != (char)Keys.Back || e.KeyChar == (char)Keys.Delete))
{
k = ((TextBox)sender).Text.Length - pPos;
}
}
if (j >= 1)
{
if (e.KeyChar == '.')
{
e.Handled = true; //让操作失效
}
}
if (k > wei)
{
if (char.IsNumber(((TextBox)sender).Text[i]) && e.KeyChar != (char)Keys.Back)
{
if (((TextBox)sender).Text.Length - ((TextBox)sender).SelectionStart < wei 1)
{
if (((TextBox)sender).SelectedText != ((TextBox)sender).Text)
{
e.Handled = true; ////让操作失效
}
}
}
}
}
}
else
{
e.Handled = true;
}
}
/// <summary>
/// 判断文本框输入的IP地址是否合法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void TextBox_Leave(object sender, EventArgs e)
{
var regex = new Regex("^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$");
var blnTest = regex.IsMatch(((TextBox)sender).Text.Trim());
if (blnTest)
{
string[] strTemp = ((TextBox)sender).Text.Trim().Split('.');
for (int j = 0; j < strTemp.Length; j )
{
if (Convert.ToInt32(strTemp[j]) > 255)
{ //大于255则提示,不符合IP格式
MessageBox.Show(this, @"存在不符合IP地址格式,请重新输入!", @"提示", MessageBoxButtons.OK, MessageBoxIcon.Question);
if (((TextBox)sender).CanFocus)
((TextBox)sender).Focus();
return;
}
}
}
else
{
//输入非数字则提示,不符合IP格式
MessageBox.Show(this, @"存在不符合IP地址格式,请重新输入!", @"提示", MessageBoxButtons.OK, MessageBoxIcon.Question);
if (((TextBox)sender).CanFocus)
((TextBox)sender).Focus();
}
}
/// <summary>
/// 光标始终放到最后位置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void TextBox_OnTextChanged(object sender, EventArgs e)
{
if (!(sender is TextBox textBox)) return;
var str = textBox.Text;
var len = Encoding.Default.GetByteCount(str);
var maxlen = textBox.MaxLength;
var bb = Encoding.Default.GetBytes(str);//得到输入的字符串的数组
if (len <= maxlen) return;
textBox.Text = Encoding.Default.GetString(bb, 0, maxlen);//将截断后的字节数组转换成字符串
textBox.SelectionStart = maxlen;//将光标放置在输入文字的最后
}
private void ServerPort_KeyPress(object sender, KeyPressEventArgs e)
{
KeyBoardInt_KeyPress(sender, e);
}
private void ClientIP_Leave(object sender, EventArgs e)
{
TextBox_Leave(sender, e);
}
private void ClearMsg_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(NetRecviceMsg.Text))
LogHelper.WriteLog(NetRecviceMsg.Text);
NetRecviceMsg.Clear();
}
private void StartBtn_Click(object sender, EventArgs e)
{
netClientAddress = ClientIP.Text.Trim();
netClientPort = ConvertHelper.ToInt(ConvertHelper.ReMoveBlank(ClientPort.Text));
var netServerPort = ConvertHelper.ToInt(ConvertHelper.ReMoveBlank(ServerPort.Text));
if (StartBtn.Text.Equals("启 动"))
{
_clientSocket = new TcpPullClient();
_clientSocket.OnConnect = OnConnect;
//接收到数据
_clientSocket.OnReceive = ClientRecvData;
//客户端已连出错
_clientSocket.OnError = ClientErrors;
if (!string.IsNullOrEmpty(netClientAddress) && netClientPort > 0)
{
_isClientNet = _clientSocket.Connetion(netClientAddress, (ushort)netClientPort);
}
_serverSocket = new TcpPullServer
{
IpAddress = "0.0.0.0",
Port = (ushort)netServerPort
};
//连接出错
_serverSocket.OnError = ServerErrors;
//客户端连接请求被接受后触发
_serverSocket.OnAccept = ServerSocketAccept;
//连接关闭后触发(服务端的连接通常是多个,只要某一个连接关闭了都会触发)
_serverSocket.OnClose = ServerSocketClose;
//接收到数据
_serverSocket.OnReceive = ServerRecvData;
//组件停止后触发
_serverSocket.OnShutdown = ServerSocketShutdown;
_serverSocket.Start();
StartBtn.Text = "停 止";
}
else
{
if (_clientSocket != null)
_clientSocket.Stop();
if (_serverSocket != null)
_serverSocket.Stop();
StartBtn.Text = "启 动";
}
}
#endregion

发货方式
自动:在特色服务中标有自动发货的商品,拍下后,源码类 软件类 商品会在订单详情页显示来自卖家的商品下载链接,点卡类 商品会在订单详情直接显示卡号密码。
手动:未标有自动发货的的商品,付款后,商品卖家会收到平台的手机短信、邮件提醒,卖家会尽快为您发货,如卖家长时间未发货,买家也可通过订单上的QQ或电话主动联系卖家。
退款说明
1、源码类:商品详情(含标题)与实际源码不一致的(例:描述PHP实际为ASP、描述的功能实际缺少、功能不能正常使用等)!有演示站时,与实际源码不一致的(但描述中有"不保证完全一样、可能有少许偏差"类似显著公告的除外);
2、营销推广类:未达到卖家描述标准的;
3、点卡软件类:所售点卡软件无法使用的;
3、发货:手动发货商品,在卖家未发货前就申请了退款的;
4、服务:卖家不提供承诺的售后服务的;(双方提前有商定和描述中有显著声明的除外)
5、其他:如商品或服务有质量方面的硬性常规问题的。未符合详情及卖家承诺的。
注:符合上述任一情况的,均支持退款,但卖家予以积极解决问题则除外。交易中的商品,卖家无法修改描述!
注意事项
1、在付款前,双方在QQ上所商定的内容,也是纠纷评判依据(商定与商品描述冲突时,以商定为准);
2、源码商品,同时有网站演示与商品详情图片演示,且网站演示与商品详情图片演示不一致的,默认按商品详情图片演示作为纠纷评判依据(卖家有特别声明或有额外商定的除外);
3、点卡软件商品,默认按商品详情作为纠纷评判依据(特别声明或有商定除外);
4、营销推广商品,默认按商品详情作为纠纷评判依据(特别声明或有商定除外);
5、在有"正当退款原因和依据"的前提下,写有"一旦售出,概不支持退款"等类似的声明,视为无效声明;
6、虽然交易产生纠纷的几率很小,卖家也肯定会给买家最完善的服务!但请买卖双方尽量保留如聊天记录这样的重要信息,以防产生纠纷时便于送码网快速介入处理。
送码声明
1、送码网作为第三方中介平台,依据双方交易合同(商品描述、交易前商定的内容)来保障交易的安全及买卖双方的权益;
2、非平台线上交易的项目,出现任何后果均与送码网无关;无论卖家以何理由要求线下交易的(如:要求买家支付宝转账付款的,微信转账付款的等),请联系管理举报,本平台将清退卖家处理。