无法打开套接字或拒绝连接:.NET相关。

5

当我尝试使用netcat向我的服务器应用程序发送一些数据时,我收到了连接被拒绝的错误。

服务器端:

IPAddress ip;
ip = Dns.GetHostEntry("localhost").AddressList[0];
IPEndPoint ipFinal = new IPEndPoint(ip, 12345);
Socket socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(ipFinal);
socket.Listen(100);
Socket handler = socket.Accept(); ------> it stops here......nothing happens

ه°‌试ن½؟用AddressFamily.InterNetwork,ه› ن¸؛ipهڈ¯èƒ½وک¯IPv4هœ°ه‌€م€‚ - Daniel A.A. Pelsmaeker
你必须向我们展示客户端代码。 - Gabe
4个回答

7
问题已经解决,我需要将数组中的位置向右移动一个位置,因为第一个位置指向IPv6地址。
IPAddress ip;
ip = Dns.GetHostEntry("localhost").AddressList[1];
IPEndPoint ipFinal = new IPEndPoint(ip, 12345);
Socket socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(ipFinal);
socket.Listen(100);
Socket handler = socket.Accept(); //------> it stops here......nothing happens

请学会格式化您的代码。只需选择代码,然后按Control-K即可。 - John Saunders

2

您的代码没有任何问题,它运行得非常完美。

在Socket类上调用Accept()方法将一直阻塞,直到客户端尝试连接到TCP端口12345。

"它停在这里; 什么都没有发生"是正确和预期的行为,但不是准确的描述。

正在发生的是您的套接字正在等待客户端连接。

请参见:http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.accept.aspx

“在阻止模式下,Accept会阻塞,直到传入的连接尝试排队。一旦接受了连接,原始Socket就会继续排队传入的连接请求,直到您关闭它。”

要测试您的代码,请打开一个telnet客户端(在命令提示符中键入“telnet”),然后输入命令“open localhost 12345”。您的代码将会“唤醒”。


不,它不会。你需要使用::1而不是本地主机,因为它绑定到IPV6而不是4。 - Dan

1
你尝试过使用TcpListener吗?
TcpListener listener = new TcpListener(IPAddress.Any, 12345);
listener.Start();
TcpClient client = listener.AcceptTcpClient();

我发现使用TcpListner和TcpClient比使用Sockets更容易。


0

有一个西班牙语的stackoverflow页面,在这个网站上请使用英语。 - Cleptus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接