@@ -1,54 +1,99 @@ | |||||
using System; | using System; | ||||
using System.IO; | |||||
using System.Diagnostics; | |||||
using System.Net; | using System.Net; | ||||
using System.Net.Sockets; | using System.Net.Sockets; | ||||
using System.Runtime.Serialization.Formatters.Binary; | |||||
using StuMgmLib.MyNameSpace; | |||||
namespace StuMgmClient | namespace StuMgmClient | ||||
{ | { | ||||
class ClientConnect | |||||
class Comm | |||||
{ | { | ||||
//连接 | |||||
public static Socket Connect(string ip, int port) | |||||
#region 基本函数 | |||||
const int bufSize = 1024 * 1024; | |||||
static IPEndPoint m_ipEndpoint; | |||||
static Socket m_socket; | |||||
static byte[] m_buf; | |||||
void Init(string ip,int port) | |||||
{ | { | ||||
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); | |||||
IPAddress ipAdress = IPAddress.Parse(ip); | IPAddress ipAdress = IPAddress.Parse(ip); | ||||
IPEndPoint ipEndpoint = new IPEndPoint(ipAdress, port); | |||||
m_ipEndpoint = new IPEndPoint(ipAdress, port); | |||||
m_buf = new byte[bufSize]; | |||||
} | |||||
void Connect() | |||||
{ | |||||
try | try | ||||
{ | { | ||||
client.Connect(ipEndpoint); | |||||
m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); | |||||
m_socket.Connect(m_ipEndpoint); | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
return null; | |||||
Debug.Print(ex.Message); | |||||
} | |||||
} | |||||
bool Send(byte[] data) | |||||
{ | |||||
try | |||||
{ | |||||
m_socket.Send(data); | |||||
return true; | |||||
} | |||||
catch(Exception e) | |||||
{ | |||||
Debug.Print(e.Message); | |||||
return false; | |||||
} | |||||
} | |||||
bool Receive() | |||||
{ | |||||
try | |||||
{ | |||||
Array.Clear(m_buf, 0, m_buf.Length); | |||||
m_socket.Receive(m_buf); | |||||
return true; | |||||
} | |||||
catch (Exception e) | |||||
{ | |||||
Debug.Print(e.Message); | |||||
return false; | |||||
} | } | ||||
return client; | |||||
} | } | ||||
//发送并进行序列化 | |||||
public static void Send(Socket client) | |||||
void DisConnect() | |||||
{ | { | ||||
MemoryStream ms = new MemoryStream(); | |||||
BinaryFormatter iFormatter = new BinaryFormatter(); | |||||
Info.ClientSend cs = new Info.ClientSend(); | |||||
cs.account= 1943; | |||||
cs.password = "1"; | |||||
iFormatter.Serialize(ms, cs); | |||||
byte[] buff = ms.GetBuffer(); | |||||
//发送消息到服务端 | |||||
client.Send(buff); | |||||
client.Close(); | |||||
} | } | ||||
//接收并进行反序列化 | |||||
public static Info.ServerSend Receive(Socket client) | |||||
#endregion | |||||
internal ErrCode VerifLogin(string userName,string pawssword,out Roles role) | |||||
{ | { | ||||
byte[] buffer = new byte[1024 * 1024]; | |||||
client.Receive(buffer); | |||||
MemoryStream ms = new MemoryStream(buffer); | |||||
BinaryFormatter iFormatter = new BinaryFormatter(); | |||||
Info.ServerSend serverSend = (Info.ServerSend)iFormatter.Deserialize(ms); | |||||
return serverSend; | |||||
role = Roles.Error; | |||||
Connect(); | |||||
UserInfo cs = new UserInfo(userName,pawssword); | |||||
byte[] sendBuf; | |||||
if(Utility.BinSerialize(cs,out sendBuf )) | |||||
return ErrCode.FailSerial; | |||||
if (Send(sendBuf)) | |||||
return ErrCode.FailSend; | |||||
if (Receive()) | |||||
return ErrCode.FailReceive; | |||||
object o; | |||||
if (Utility.BinDeserialize(m_buf, out o)) | |||||
return ErrCode.FailDeserial; | |||||
if (!(o is UserInfo)) | |||||
return ErrCode.ErrData; | |||||
DisConnect(); | |||||
role = ((UserInfo)o).UserRole; | |||||
return ErrCode.Success; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -2,8 +2,20 @@ | |||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Data; | using System.Data; | ||||
namespace StuMgmClient | namespace StuMgmClient | ||||
{ | { | ||||
enum ErrCode | |||||
{ | |||||
Success, | |||||
FailSerial, | |||||
FailDeserial, | |||||
FailSend, | |||||
FailReceive, | |||||
ErrData, | |||||
} | |||||
public enum Roles | public enum Roles | ||||
{ | { | ||||
NotFound = -1, | NotFound = -1, | ||||
@@ -12,6 +24,38 @@ namespace StuMgmClient | |||||
Teacher = 2, | Teacher = 2, | ||||
Student = 3, | Student = 3, | ||||
} | } | ||||
[Serializable] | |||||
public class UserInfo | |||||
{ | |||||
public string Account; | |||||
public string Password; | |||||
public Roles UserRole; | |||||
public UserInfo(string account, string password) | |||||
{ | |||||
Account = account; | |||||
Password = password; | |||||
} | |||||
} | |||||
[Serializable] | |||||
public class ServerSend | |||||
{ | |||||
public short permission { get; set; } | |||||
public DataSet ds { get; set; } | |||||
} | |||||
} | |||||
namespace StuMgmClient | |||||
{ | |||||
class Data | class Data | ||||
{ | { | ||||
//状态值字符串转字典 | //状态值字符串转字典 | ||||
@@ -1,10 +1,6 @@ | |||||
using System; | using System; | ||||
using System.Collections.Generic; | |||||
using System.ComponentModel; | |||||
using System.Data; | using System.Data; | ||||
using System.Drawing; | |||||
using System.Net.Sockets; | using System.Net.Sockets; | ||||
using System.Text; | |||||
using System.Text.RegularExpressions; | using System.Text.RegularExpressions; | ||||
using System.Windows.Forms; | using System.Windows.Forms; | ||||
using StuMgmLib.MyNameSpace; | using StuMgmLib.MyNameSpace; | ||||
@@ -13,94 +9,101 @@ namespace StuMgmClient | |||||
{ | { | ||||
public partial class LoginForm : Form | public partial class LoginForm : Form | ||||
{ | { | ||||
public static LoginForm login; | |||||
public LoginForm() | public LoginForm() | ||||
{ | { | ||||
InitializeComponent(); | InitializeComponent(); | ||||
} | } | ||||
string userName = ""; | |||||
string pawssWord = ""; | |||||
DataSet ds = null; | |||||
//DataSet ds = null; | |||||
////账号密码正则校验 | |||||
//public bool RegexUser(string u, string p) | |||||
//{ | |||||
// var regex = new Regex("^(?![0-9]+$)(?![a-zA-Z]+$)(?![a-z!@#$]+$)(?![A-Z!@#$]+$)(?![\\d!@#$]+$)^[a-zA-Z\\d!@#$]{5,20}$"); | |||||
// //校验密码是否符合 | |||||
// bool resultU = regex.IsMatch(u); | |||||
// bool resultP = regex.IsMatch(p); | |||||
// if (resultU == true && resultP == true) | |||||
// { | |||||
// return true; | |||||
// } | |||||
// else | |||||
// { | |||||
// return false; | |||||
// } | |||||
//} | |||||
private void chkPassWord_CheckedChanged(object sender, EventArgs e) | |||||
{ | |||||
} | |||||
private void labForgetPassword_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) | |||||
{ | |||||
} | |||||
private void btnSubmit_Click(object sender, EventArgs e) | private void btnSubmit_Click(object sender, EventArgs e) | ||||
{ | { | ||||
Login(); | Login(); | ||||
} | } | ||||
//登陆方法 | //登陆方法 | ||||
public void Login() | public void Login() | ||||
{ | { | ||||
userName = txtUserName.Text; | |||||
pawssWord = txtPassWord.Text; | |||||
//if (!RegexUser(userName, pawssWord)) | |||||
//{ | |||||
// MessageBox.Show("用户名和密码必须包含数字,小写或大写,5到20位", "提示"); | |||||
// return; | |||||
//} | |||||
string userName = txtUserName.Text; | |||||
string pawssword = txtPassWord.Text; | |||||
Info.ServerSend ss = ConnectServer(); | Info.ServerSend ss = ConnectServer(); | ||||
//权限管理 | |||||
int powerNum = (int)ss.permission; | |||||
ds = ss.ds; | |||||
switch (powerNum) | |||||
{ | |||||
case (int)Roles.Student: | |||||
StudentForm stu = new StudentForm(ds); | |||||
stu.Show(); | |||||
login.Hide(); | |||||
break; | |||||
case (int)Roles.Teacher: | |||||
TeacherForm tf = new TeacherForm(ds); | |||||
tf.Show(); | |||||
login.Hide(); | |||||
break; | |||||
case (int)Roles.Admin: | |||||
AdminForm af = new AdminForm(); | |||||
af.Show(); | |||||
login.Hide(); | |||||
break; | |||||
case (Int32)Roles.NotFound: | |||||
MessageBox.Show("账号或用户名错误", "提示"); | |||||
break; | |||||
} | |||||
} | } | ||||
//账号密码正则校验 | |||||
public bool RegexUser(string u, string p) | |||||
{ | |||||
var regex = new Regex("^(?![0-9]+$)(?![a-zA-Z]+$)(?![a-z!@#$]+$)(?![A-Z!@#$]+$)(?![\\d!@#$]+$)^[a-zA-Z\\d!@#$]{5,20}$"); | |||||
//校验密码是否符合 | |||||
bool resultU = regex.IsMatch(u); | |||||
bool resultP = regex.IsMatch(p); | |||||
if (resultU == true && resultP == true) | |||||
{ | |||||
return true; | |||||
} | |||||
else | |||||
{ | |||||
return false; | |||||
} | |||||
} | |||||
//登陆连接服务器 | |||||
public Info.ServerSend ConnectServer() | |||||
{ | |||||
Socket client= ClientConnect.Connect("10.10.0.44", 502); | |||||
if (client== null) | |||||
{ | |||||
MessageBox.Show("连接失败", "提示"); | |||||
return null; | |||||
} | |||||
else | |||||
{ | |||||
ClientConnect.Send(client); | |||||
Info.ServerSend ss = ClientConnect.Receive(client); | |||||
return ss; | |||||
} | |||||
} | |||||
//窗体加载 | |||||
private void LoginForm_Load(object sender, EventArgs e) | |||||
{ | |||||
login = this; | |||||
} | |||||
////权限管理 | |||||
// int powerNum = (int)ss.permission; | |||||
// ds = ss.ds; | |||||
// switch (powerNum) | |||||
// { | |||||
// case (int)Roles.Student: | |||||
// StudentForm stu = new StudentForm(ds); | |||||
// stu.Show(); | |||||
// login.Hide(); | |||||
// break; | |||||
// case (int)Roles.Teacher: | |||||
// TeacherForm tf = new TeacherForm(ds); | |||||
// tf.Show(); | |||||
// login.Hide(); | |||||
// break; | |||||
// case (int)Roles.Admin: | |||||
// AdminForm af = new AdminForm(); | |||||
// af.Show(); | |||||
// login.Hide(); | |||||
// break; | |||||
// case (Int32)Roles.NotFound: | |||||
// MessageBox.Show("账号或用户名错误", "提示"); | |||||
// break; | |||||
// } | |||||
////登陆连接服务器 | |||||
//public Info.ServerSend ConnectServer() | |||||
//{ | |||||
// Socket client= ClientConnect.Connect("10.10.0.44", 502); | |||||
// if (client== null) | |||||
// { | |||||
// MessageBox.Show("连接失败", "提示"); | |||||
// return null; | |||||
// } | |||||
// else | |||||
// { | |||||
// ClientConnect.Send(client); | |||||
// Info.ServerSend ss = ClientConnect.Receive(client); | |||||
// return ss; | |||||
// } | |||||
//} | |||||
} | } | ||||
} | } |
@@ -31,7 +31,7 @@ | |||||
this.components = new System.ComponentModel.Container(); | this.components = new System.ComponentModel.Container(); | ||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LoginForm)); | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LoginForm)); | ||||
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); | this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); | ||||
this.linkLabel1 = new System.Windows.Forms.LinkLabel(); | |||||
this.labForgetPassword = new System.Windows.Forms.LinkLabel(); | |||||
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); | this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); | ||||
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); | this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); | ||||
this.lblHead = new System.Windows.Forms.Label(); | this.lblHead = new System.Windows.Forms.Label(); | ||||
@@ -60,19 +60,20 @@ | |||||
// | // | ||||
this.toolTip1.IsBalloon = true; | this.toolTip1.IsBalloon = true; | ||||
// | // | ||||
// linkLabel1 | |||||
// | |||||
this.linkLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | |||||
this.linkLabel1.AutoSize = true; | |||||
this.linkLabel1.LinkColor = System.Drawing.Color.DodgerBlue; | |||||
this.linkLabel1.Location = new System.Drawing.Point(125, 12); | |||||
this.linkLabel1.Name = "linkLabel1"; | |||||
this.linkLabel1.Size = new System.Drawing.Size(117, 15); | |||||
this.linkLabel1.TabIndex = 7; | |||||
this.linkLabel1.TabStop = true; | |||||
this.linkLabel1.Text = "忘记密码"; | |||||
this.linkLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; | |||||
this.toolTip1.SetToolTip(this.linkLabel1, "请联系教师!"); | |||||
// labForgetPassword | |||||
// | |||||
this.labForgetPassword.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | |||||
this.labForgetPassword.AutoSize = true; | |||||
this.labForgetPassword.LinkColor = System.Drawing.Color.DodgerBlue; | |||||
this.labForgetPassword.Location = new System.Drawing.Point(125, 12); | |||||
this.labForgetPassword.Name = "labForgetPassword"; | |||||
this.labForgetPassword.Size = new System.Drawing.Size(117, 15); | |||||
this.labForgetPassword.TabIndex = 7; | |||||
this.labForgetPassword.TabStop = true; | |||||
this.labForgetPassword.Text = "忘记密码"; | |||||
this.labForgetPassword.TextAlign = System.Drawing.ContentAlignment.MiddleRight; | |||||
this.toolTip1.SetToolTip(this.labForgetPassword, "请联系教师!"); | |||||
this.labForgetPassword.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.labForgetPassword_LinkClicked); | |||||
// | // | ||||
// tableLayoutPanel2 | // tableLayoutPanel2 | ||||
// | // | ||||
@@ -240,7 +241,7 @@ | |||||
this.tableLayoutPanel4.ColumnCount = 2; | this.tableLayoutPanel4.ColumnCount = 2; | ||||
this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); | this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); | ||||
this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); | this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); | ||||
this.tableLayoutPanel4.Controls.Add(this.linkLabel1, 1, 0); | |||||
this.tableLayoutPanel4.Controls.Add(this.labForgetPassword, 1, 0); | |||||
this.tableLayoutPanel4.Controls.Add(this.chkPassWord, 0, 0); | this.tableLayoutPanel4.Controls.Add(this.chkPassWord, 0, 0); | ||||
this.tableLayoutPanel4.Location = new System.Drawing.Point(102, 165); | this.tableLayoutPanel4.Location = new System.Drawing.Point(102, 165); | ||||
this.tableLayoutPanel4.Name = "tableLayoutPanel4"; | this.tableLayoutPanel4.Name = "tableLayoutPanel4"; | ||||
@@ -259,6 +260,7 @@ | |||||
this.chkPassWord.TabIndex = 6; | this.chkPassWord.TabIndex = 6; | ||||
this.chkPassWord.Text = "记住密码"; | this.chkPassWord.Text = "记住密码"; | ||||
this.chkPassWord.UseVisualStyleBackColor = true; | this.chkPassWord.UseVisualStyleBackColor = true; | ||||
this.chkPassWord.CheckedChanged += new System.EventHandler(this.chkPassWord_CheckedChanged); | |||||
// | // | ||||
// LoginForm | // LoginForm | ||||
// | // | ||||
@@ -309,7 +311,7 @@ | |||||
private System.Windows.Forms.TextBox txtPassWord; | private System.Windows.Forms.TextBox txtPassWord; | ||||
private System.Windows.Forms.PictureBox picPassWord; | private System.Windows.Forms.PictureBox picPassWord; | ||||
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel4; | private System.Windows.Forms.TableLayoutPanel tableLayoutPanel4; | ||||
private System.Windows.Forms.LinkLabel linkLabel1; | |||||
private System.Windows.Forms.LinkLabel labForgetPassword; | |||||
private System.Windows.Forms.CheckBox chkPassWord; | private System.Windows.Forms.CheckBox chkPassWord; | ||||
} | } | ||||
@@ -123,9 +123,6 @@ | |||||
<metadata name="txtUserName.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> | <metadata name="txtUserName.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> | ||||
<value>True</value> | <value>True</value> | ||||
</metadata> | </metadata> | ||||
<metadata name="txtUserName.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> | |||||
<value>True</value> | |||||
</metadata> | |||||
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> | <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> | ||||
<data name="picUserName.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | <data name="picUserName.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | ||||
<value> | <value> | ||||
@@ -153,9 +150,6 @@ | |||||
<metadata name="txtPassWord.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> | <metadata name="txtPassWord.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> | ||||
<value>True</value> | <value>True</value> | ||||
</metadata> | </metadata> | ||||
<metadata name="txtPassWord.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> | |||||
<value>True</value> | |||||
</metadata> | |||||
<data name="picPassWord.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | <data name="picPassWord.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | ||||
<value> | <value> | ||||
iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAA4BJREFUaEPV | iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAA4BJREFUaEPV | ||||
@@ -91,6 +91,7 @@ | |||||
<Compile Include="StudentNavigation.Designer.cs"> | <Compile Include="StudentNavigation.Designer.cs"> | ||||
<DependentUpon>StudentNavigation.cs</DependentUpon> | <DependentUpon>StudentNavigation.cs</DependentUpon> | ||||
</Compile> | </Compile> | ||||
<Compile Include="Utility.cs" /> | |||||
<EmbeddedResource Include="SelectFrom.resx"> | <EmbeddedResource Include="SelectFrom.resx"> | ||||
<DependentUpon>SelectFrom.cs</DependentUpon> | <DependentUpon>SelectFrom.cs</DependentUpon> | ||||
</EmbeddedResource> | </EmbeddedResource> | ||||
@@ -0,0 +1,45 @@ | |||||
using System; | |||||
using System.Diagnostics; | |||||
using System.IO; | |||||
using System.Runtime.Serialization.Formatters.Binary; | |||||
namespace StuMgmClient | |||||
{ | |||||
class Utility | |||||
{ | |||||
internal static bool BinSerialize<T>(T data, out byte[] buff) | |||||
{ | |||||
try | |||||
{ | |||||
MemoryStream ms = new MemoryStream(); | |||||
BinaryFormatter iFormatter = new BinaryFormatter(); | |||||
iFormatter.Serialize(ms, data); | |||||
buff = ms.GetBuffer(); | |||||
return true; | |||||
} | |||||
catch (Exception e) | |||||
{ | |||||
Debug.Print(e.Message); | |||||
buff = null; | |||||
return false; | |||||
} | |||||
} | |||||
internal static bool BinDeserialize(byte[] data, out object o) | |||||
{ | |||||
try | |||||
{ | |||||
MemoryStream ms = new MemoryStream(data); | |||||
BinaryFormatter iFormatter = new BinaryFormatter(); | |||||
o = iFormatter.Deserialize(ms); | |||||
return true; | |||||
} | |||||
catch (Exception e) | |||||
{ | |||||
Debug.Print(e.Message); | |||||
o = null; | |||||
return false; | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -4,22 +4,33 @@ using System.Data; | |||||
namespace StuMgmLib.MyNameSpace | namespace StuMgmLib.MyNameSpace | ||||
{ | { | ||||
public class Info | |||||
[Serializable] | |||||
public class UserInfo | |||||
{ | { | ||||
[Serializable] | |||||
public class ClientSend | |||||
public string Account; | |||||
public string Password; | |||||
public UserInfo(string account,string password) | |||||
{ | { | ||||
public short account { get; set; } | |||||
public string password { get; set; } | |||||
public string [] sqlStr { get; set; } | |||||
Account = account; | |||||
Password = password; | |||||
} | } | ||||
[Serializable] | |||||
} | |||||
[Serializable] | |||||
public class UserInfo | |||||
{ | |||||
public short UserLevel; | |||||
} | |||||
[Serializable] | |||||
public class ServerSend | public class ServerSend | ||||
{ | { | ||||
public short permission { get; set; } | public short permission { get; set; } | ||||
public DataSet ds { get; set; } | public DataSet ds { get; set; } | ||||
} | } | ||||
} | |||||
} | } |