双线的socket服务器端应该如何编写?

wws403945133 2014-07-25 11:45:18
【问题1】手机与服务器端通过socket通信,服务器端采用c#编写,现在有个问题是,服务器是双线的,也就是有两个ip,一个联通,一个电信,要求是不管是哪一个都能接收到socket连接。
【问题2】如何关闭socket监听的套接字,现在的这个有问题。
【问题3】当前的模式是阻塞模式吗
代码如下:

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();
}

}
...全文
110 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧