我需要一个侦听多个端口的服务器。
多个客户端可以连接到每个端口。连接后,服务器用户可以选择每个客户端并向其发送文本,客户端将响应此文本。 我使用线程来完成这项工作,但是当我尝试在多个端口上进行侦听时,我会收到错误消息
"通常只允许使用每个套接字地址(协议/网络地址/端口)"。
如何解决这个问题,如何在客户端连接到服务器并向其发送文本后访问线程?
我的源代码:
private void activeToolStripMenuItem_Click(object sender, EventArgs e)
{
//for each port entered in list box,make a thread
if (ListBox1.Items.Count != 0)
{
activeToolStripMenuItem.Enabled = false;
inactiveToolStripMenuItem.Enabled = true;
for ( i = 0; i < ListBox1.Items.Count; ++i)
{
serverThread = new Thread(new ThreadStart(StartServer));
serverThread.Start();
}
}
else
{
MessageBox.Show("You Should Add at least 1 port, to Listening Ports List.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void StartServer()
{
counter = counter + 1;
string Remote_Host_IP;
int j = i - 1;
port = Convert.ToInt32(ListBox1.Items[counter]);
TcpListener listener = new TcpListener(IPAddress.Any, port);
listener.Start();
while (true)
{
mainSocket = listener.AcceptSocket();
// you'll need some more thread stuff down here.
if (mainSocket.Connected)
{
Connected_Num = Connected_Num + 1;
Remote_Host_IP = mainSocket.RemoteEndPoint.ToString();
this.Invoke(new MethodInvoker(() => AddConnection(Remote_Host_IP)));
}
}
}
答案 0 :(得分:0)
Nononono :)您需要在创建时将端口号传递/发送到accept()线程,而不是通过所有线程空间中的某个“计数器”。此外,您不应该在非GUI线程中阅读列表框。
迭代列表并从GUI线程事件处理程序中的ListBox获取端口号,并将端口号而不是ListBox索引作为创建参数传递给接受线程。
首先解决此问题,然后考虑服务器用户与客户端进行交互。您将需要某种协议,允许每个客户端/用户识别自己。