双线的socket服务器端应该如何编写?
【问题1】手机与服务器端通过socket通信,服务器端采用c#编写,现在有个问题是,服务器是双线的,也就是有两个ip,一个联通,一个电信,要求是不管是哪一个都能接收到socket连接。
【问题2】如何关闭socket监听的套接字,现在的这个有问题。
【问题3】当前的模式是阻塞模式吗
代码如下:
【问题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();
}
}
...全文
相关推荐
TCP读写双线程程序
**套接字(Socket)**:套接字是进程间通信的一种接口,用于实现TCP/IP协议。在Ubuntu系统中,程序员可以通过调用socket库函数创建、绑定、监听、接受和连接套接字,进而实现网络通信。
内置双线程聊天窗口(MFC)
在这个聊天应用中,我们需要创建服务器端的socket来监听客户端的连接请求,同时每个客户端也需要有自己的socket来连接服务器并发送/接收数据。
基于多线程的Linux聊天室系统
服务器端接收客户端消息并广播转发,客户端支持用户登录与双线程收发消息。代码核心为C语言编写,利用socket
基于sockect tcp实现双线程收发文件python源码+介绍+超详细注释(课程作业).zip
本文介绍了一个基于TCP socket的简易文件传输服务,包括服务器端和客户端的实现。服务器端监听8081端口,接收并压缩文件后发送回客户端;客户端通过输入路径发送文件。代码涉及socket编程、多线
深入php socket的讲解与实例分析
- SOCK_SEQPACKET:提供双线路、可靠的连接,用于固定长度的数据包传输。- SOCK_RAW:允许直接访问协议栈,常用于ICMP协议的ping、traceroute工具。


