【发布时间】:2014-07-15 06:16:52
【问题描述】:
我创建了一个使用套接字和多线程技术的服务器“中间人”应用程序(ServerListener 在新线程中运行)。我很早就发现,当我使用 Socket.Accept() 方法时,程序会无限期地挂起,等待连接发生。问题是,据我所知,没有理由不这样做。
我花了一天的大部分时间尝试了很多不同的事情来让它发挥作用,但在某个地方发生了一些变化,因为它突然开始工作了一段时间。但是,一旦我不小心为客户端应用程序选择了与“localhost”不同的数据源,问题又再次出现。我尝试在不运行防火墙或防病毒软件的情况下运行该程序,但没有运气。客户端程序设置为连接端口 10000。这是我的代码:
public void ServerListener() {
UpdateStatus("Establishing link to server");
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(new IPEndPoint(IPAddress.Any, defaultPort));
server.Listen(queue);
UpdateStatus("Accepting Connections");
while (true) {
Socket client = default(Socket);
try {
client = server.Accept();
if (client != null) {
++count;
UpdateCount(count.ToString());
new Thread(
() => {
Client myclient = new Client(client, defaultPort, this);
}
).Start();
}
}
catch( Exception ex ){
MessageBox.Show(ex.ToString());
client.Close();
}
}
}
它会一直运行到 server.Accept(),然后挂起。如前所述,它确实工作了一段时间,但现在又挂了。我试图查看是否有任何其他程序正在使用端口 10000,但它们没有。我和朋友翻了一遍又一遍,我们找不到问题所在。请帮忙!
EDIT 明确地说,我知道 Accept 是一个阻塞调用。客户端程序在端口 10000 上建立连接,但该程序继续等待 Accept,就好像什么都没发生一样。它确实工作了一段时间,所以我知道连接的工作方式就像它应该从客户端程序的末端一样工作。但是,我无法理解为什么这个程序现在表现得好像连接永远不会发生,并继续等待接受。
【问题讨论】:
-
但这就是假设的工作方式。
Accept正在阻止呼叫。 -
也许我应该更清楚。接受是阻塞的,但是一旦建立连接,它应该继续前进,对吗?连接是从客户端程序进来的,但是accept一直在等待,好像什么都没发生一样
-
是的,直到下一次在您的循环中调用
Accept。听起来您在调试多线程代码时遇到了麻烦。 -
您似乎想接受单个连接。如果是这样,为什么还要循环呢?
-
一次可能有多个客户端连接
标签: c# multithreading sockets