可以';t绑定已连接的套接字

本文关键字:连接 套接字 绑定 可以 | 更新日期: 2023-09-27 18:28:37

所以我对"Socket"编程很陌生,似乎有一些东西我从根本上误解了。。。

我使用的服务器的文档写得很差,但说它使用了"基于事件的"流式套接字连接"。。。服务器在本地网络上。

这是我的第一个天真的程序流(没有异步或任何东西!):

1) 首先我需要一个插座。。。没问题。。。我明白了:)

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

2) 然后我连接它。。。也没问题:)

s.Connect("10.10.10.36", 6009);

3) 现在我有了连接,服务器给了我新的本地EP。。。类似于"10.10.10.59:56231"…所以我尝试绑定到那个EP:

s.Bind (s.LocalEndPoint);

之后,我需要倾听并开始接受连接:

s.Listen (10);
s.Accept ();

"s.Bind(s.LocalEndPoint);"失败(我在没有调试器的情况下运行它),出现以下情况:

Unhandled Exception:
System.Net.Sockets.SocketException: Invalid arguments
  at System.Net.Sockets.Socket.Bind (System.Net.EndPoint local_end) [0x00065] in /private/tmp/source/bockbuild-xamarin/profiles/mono-mac-xamarin-no-pcl/build-root/mono-3.2.0/mcs/class/System/System.Net.Sockets/Socket.cs:1115 
  at RFID.MainClass.Main (System.String[] args) [0x0002b] in /Users/jab/Projects/RFID/RFID/Program.cs:17 
[ERROR] FATAL UNHANDLED EXCEPTION: System.Net.Sockets.SocketException: Invalid arguments
  at System.Net.Sockets.Socket.Bind (System.Net.EndPoint local_end) [0x00065] in /private/tmp/source/bockbuild-xamarin/profiles/mono-mac-xamarin-no-pcl/build-root/mono-3.2.0/mcs/class/System/System.Net.Sockets/Socket.cs:1115 
  at RFID.MainClass.Main (System.String[] args) [0x0002b] in /Users/jab/Projects/RFID/RFID/Program.cs:17 

现在我知道这是一个非常原始的问题,但我需要指出正确的方向:)

TIA。

可以';t绑定已连接的套接字

问题的出现是因为您connect了套接字。但是您只需要连接客户端(而不是服务器)。要获得要侦听的本地端点,只需自己创建一个即可:

IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 6009);
s.Bind (localEndPoint);

在这之后,它应该会起作用。

bind()不适用于客户端的原因是connect()将客户端套接字隐式绑定到临时端口号。但是,如果在connect()之前尝试bind(),那么它会成功。所以,对于客户端,您所需要做的就是打开一个套接字并进行连接。对于服务器端,您需要打开一个套接字,将其绑定到一个端口,开始侦听,然后使用accept()获取挂起的连接。