4,356
社区成员
发帖
与我相关
我的任务
分享
public ManualResetEvent AcceptDone = new ManualResetEvent(false); //连接的信号
//开始停止服务按钮
private void startService_Click(object sender, EventArgs e)
{
//判断
if (textBox1.Text.Trim() == "" || serverport.Text.Trim() == "")
{
MessageBox.Show("服务器ip和端口号必须填写!");
return;
}
// 实例化新线程
myThread = new Thread(new ThreadStart(Listen));
if (btnstatu)
{
myThread.Start();
statuBar.Text = "服务已启动,等待客户端连接";
btnstatu = false;
}
else
{
//停止服务(绑定的套接字没有关闭,因此客户端还是可以连接上来)
// myThread.Interrupt();
try
{
newsock.Shutdown(SocketShutdown.Both);
}
catch { }
newsock.Close();
myThread.Abort();
btnstatu = true;
}
}
//监听函数
public void Listen()
{
//后台线程
Thread.CurrentThread.IsBackground = true;
//初始化SOCKET实例
newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//初始化终结点实例
ipa = IPAddress.Parse(textBox1.Text.Trim());
setPort = int.Parse(serverport.Text.Trim());
localEP=new IPEndPoint(ipa,setPort);
try
{
newsock.IOControl(IOControlCode.KeepAliveValues, GetKeepAliveSetting(1,1000,1000), null);
//绑定
newsock.Bind(localEP);
//监听
newsock.Listen(500);
//开始接受连接,异步。
showClientMsg("开始接受连接,异步。\r\n");
writesql("开始接受连接,异步。\r\n", "linshi.txt");//记录监控
while (true)
{
AcceptDone.Reset();
try
{
newsock.BeginAccept(new AsyncCallback(AcceptCallback), newsock);
}
catch
{
showClientMsg("接收异常\r\n");
writesql("接收异常\r\n", "linshi.txt");//记录监控
Thread.Sleep(1000);
newsock.BeginAccept(new AsyncCallback(AcceptCallback), newsock);
}
AcceptDone.WaitOne();
}
}
catch (Exception ex)
{
showClientMsg(ex.Message);
}
}
public void AcceptCallback(IAsyncResult ar) //accpet的回调处理函数
{
AcceptDone.Set();
server1 = (Socket)ar.AsyncState;
//将接收到的Socket传给Client,然后继续监听
Client = server1.EndAccept(ar);
Control.CheckForIllegalCrossThreadCalls = false;
DateTimeOffset now = DateTimeOffset.Now;
//将提示信息发送给客户端,并在服务端显示连接信息。
ClientIP = (Client.RemoteEndPoint as IPEndPoint).Address;//获取远程端口的ip地址
ClientPORT = (Client.RemoteEndPoint as IPEndPoint).Port;//获取远程的端口
ClientName = "IP:" + ClientIP + "Port:" + ClientPORT;
showClientMsg("【接收到SOCKET为" + ClientName + "的连接请求】-------------开始" + DateTime.Now.ToString() + "\r\n");
writesql("【接收到SOCKET为" + ClientName + "的连接请求】----------------开始" + DateTime.Now.ToString() + "\r\n", "linshi.txt");
StateObject state = new StateObject();
state.workSocket = Client;
state.socketid = ClientName;
try
{
Client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
}
catch(SocketException)
{
Client.Shutdown(SocketShutdown.Both);
Client.Close();
Thread.CurrentThread.Abort();
}
}