我想通过TCP协议连接设备[一种调制解调器]。
该设备可被视为客户端。通过我想要的程序 连接到此设备。该程序位于服务器上 有一个特殊的端口打开和一个静态IP。
我该怎么办?
这是我的代码:
// where ip= 10.0.0.50 and port= 5050, established for the server!
TcpListerner listener;
if listener!= null)
{
listener.Stop();
}
listener= new TcpListener(ip, port);
listener.Start();
Socket socket;
if (!listener.Pending())
{
IAsyncResult ar = listener.BeginAcceptSocket(new AsyncCallback(DoAcceptSocketCallback), socket);
Thread.Sleep(15000); // try to connect in 15 seconds
if (socket != null && socket.Connected)
{
// if socket is connected
// put the code here or do nothing
}
else
{
if (socket != null)
{
socket.Close();
}
if listener!= null)
{
listener.Stop();
listener = null;
}
}
}
public void DoAcceptSocketCallback(IAsyncResult ar)
{
try
{
TcpListener listener = (TcpListener)ar.AsyncState;
if (listener != null)
{
// connected to socket :
socket = listener.EndAcceptSocket(ar);
}
}
catch
{
socket = null;
}
}
虽然我无法连接设备但我无法通过套接字连接解决挂起问题。在此代码运行时,我无法对我的表单执行任何操作,因为尝试连接时间为15秒。
答案 0 :(得分:1)
我认为您应该对代码进行一些更改。
当客户端连接时,使用此语句
创建TcpClient对象TcpClient client = listener.AcceptTcpClient()
然后,您可以创建一个线程来处理客户端,以便主线程不会被卡住。
if (!listener.Pending())
{
TcpClient client = listener.AcceptTcpClient();
Thread newThread = new Thread(this.ServeClient);
newThread.Start(client);
}
然后处理线程的方法
public static void ServerClient(TcpClient client)
{
// Do some work
}
如果使用线程池而不是在每个连接上创建一个新线程,那会更好。使用此方法,您可以控制服务器可以处理的最大连接数。我不太了解这个功能,因为我没有在大型程序中使用它。