我正在开发两个应用程序(服务器一个和客户端一个),两者都通过 TCP 端口 7447 相互通信。
服务器应用程序已在运行并已连接到上述端口:
Prompt>netstat -aon | findstr "7447"
UDP 0.0.0.0:7447 *:* 41316
Prompt>tasklist /FI "PID eq 41316"
Image Name PID Session Name Session# Mem Usage
========================= ======== ================ =========== ============
MyServer.exe 41316 Console 1 71.308 K
在客户端应用程序中,我尝试从服务器应用程序接收信息,如下所示:
private void Receive()
{
BaseTelegram telegram = null;
IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, this._listenPort);
try
{
Byte[] receivedBytes = this._udpClient.Receive(ref endpoint);
提到的
_udpClient
具有以下属性:
我也知道它是通过这个源代码传递的:
public UdpConnection(System.Net.Sockets.UdpClient udpClient, Int32 listenPort)
{
this._listenPort = listenPort;
this._udpClient = udpClient;
}
我知道客户端应用程序正在客户站点上运行,但在我的电脑上,我收到以下异常:
System.InvalidOperationException: 'You must call the Bind method before performing this operation.'
我对如何调整源代码以使其工作不感兴趣(因为代码在客户的场所工作,它也应该在我的电脑上工作),我想知道我需要哪种配置更改以使此代码正常工作。
有人有想法吗?
谢谢
如果构造
UdpClient
时不指定端口参数,则客户端不会绑定本地端口,也无法调用Receive
方法。例如:
this._udpClient = new UdpClient();
var endpoint = new IPEndPoint(IPAddress.Any, this._listenPort);
// You must call the Bind method before performing this operation.
this._udpClient.Receive(ref endpoint);
这个行为在文档中提到过:
在调用 ReceiveFrom 之前,必须使用 Bind 方法显式地将 Socket 绑定到本地端点。如果不这样做,ReceiveFrom 将抛出 SocketException。
直接的解决办法是在构造
UdpClient
时指定一个端口参数(0也是可以的):
this._udpClient = new UdpClient(0);
另一个隐式解决方案是在调用
Send
方法之前先调用 Receive
方法,那是 因为底层服务提供者会分配最合适的本地网络地址和端口号。
this._udpClient = new UdpClient();
this._udpClient.Send(data, dataLength, remoteEP);
....
this._udpClient.Receive(ref endpoint);