执行此操作之前必须调用 Bind 方法 => 不,我不

问题描述 投票:0回答:1

我正在开发两个应用程序(服务器一个和客户端一个),两者都通过 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
具有以下属性: Properties screenshot

我也知道它是通过这个源代码传递的:

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.'

我对如何调整源代码以使其工作不感兴趣(因为代码在客户的场所工作,它也应该在我的电脑上工作),我想知道我需要哪种配置更改以使此代码正常工作。

有人有想法吗?

谢谢

c# tcp binding udp tcp-port
1个回答
0
投票

如果构造

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);
© www.soinside.com 2019 - 2024. All rights reserved.