protected IPAddress serverIP ;
protected IPEndPoint serverFullAddr;
protected Socket sock;
public struct server_sender //服务器向客户发送的结构体
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public char[] caller ; //通道用户的电话号码
public int Sex; //性别
public int ConfNo;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] //会议室号码
public char[] TelQQNum;//QQ号码
public int State; //通道状态
}
public struct client_sender //客户端向服务器发送的结构体
{
public int cmd; //命令编号
//0:获取通道信息
//1:加入某个会议室
//2:退出会议室
public int cmd_parms; //命令参数
//cmd = 1
//cmd_parms = 0 按顺序进入1个会议室
//cmd_parms = n 为进入第N个会议室
public int user_no; //客户通道号
}
public client_sender c_sender;
public static server_sender[] s_sender = new server_sender[5];
//建立连接
public void Connect(string ip, int dkou)
{
serverIP = IPAddress.Parse(ip);
serverFullAddr = new IPEndPoint(serverIP, dkou);
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Connect(serverFullAddr); //建立连接
//启动线程接收数据
Thread t = new Thread(new ThreadStart(ReceiveMsg));
t.Name = "Receive Message";
t.IsBackground = true;
t.Start();
}
//接收数据
public void ReceiveMsg()
{
while (true)
{
int b_count = 52;
int j;
byte[] byteRec = new byte[5000];
j = this.sock.Receive(byteRec);
int a = j / b_count;
for (int i = 0; i < a; i++)
{
s_sender[i] = (server_sender)BytesToStruct(byteRec, i);
}
}
}
//将struct转化为byte
public static byte[] StructToBytes(object structObj)
{
int size = Marshal.SizeOf(structObj);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.StructureToPtr(structObj, buffer, false);
byte[] bytes = new byte[size];
Marshal.Copy(buffer, bytes, 0, size);
return bytes;
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}
//将byte转化为struct
public static object BytesToStruct(byte[] bytes, int count)
{
int size = 52;
int start = size * count;
object sender = new object();
try
{
IntPtr buffer = Marshal.AllocHGlobal(size);
Marshal.Copy(bytes, start, buffer, size);
sender = Marshal.PtrToStructure(buffer, typeof(server_sender));
Marshal.FreeHGlobal(buffer);
}
catch (Exception ex)
{
return "转换发生错误!" + ex.Message;
}
return sender;
}
//发送指令
public void Send(byte[] byteSend)
{
this.sock.Send(byteSend);
//启动线程接收数据
Thread t = new Thread(new ThreadStart(ReceiveMsg));
t.Name = "Receive Message";
t.IsBackground = true;
t.Start();
}
评论11
最新资源