0

ローカルホストでデータを送受信する単純な UDP プログラムを C# で作成しようとしています。私は C# の初心者ですが、MATLAB の方がずっと得意なので、C# でサーバーとクライアントを記述する代わりに、C# を使用してデータを送信し、MATLAB で受信することにしました。

データを送信するために 2 つの方法を試しました。Socket クラスの使用は機能しましたが、UdpClient クラスの使用は失敗しました。

このコードを実行する前に、MATLAB コードを実行して、受信したデータグラムを出力するようにコールバック関数を設定します。

各実行でアクティブになるリージョンは 1 つだけです。もう一方をコメントアウトします。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;

namespace udp1
{
    class Program
    {
        const int port = 62745; //Chosen at random
        static void Main(string[] args)
        {
            string str = "Hello World!";
            byte[] sendBytes = Encoding.ASCII.GetBytes(str);

            #region 1 Send data using socket class
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
            sock.SendTo(sendBuff, ipEndPoint);
            Console.ReadLine();
            #endregion

            #region 2 Send data using UdpClient class
            UdpClient sendingClient = new UdpClient(port);
            sendingClient.Send(sendBytes, sendBytes.Length);
            #endregion
        }
    }
}

私は得ています

通常、各ソケット アドレス (プロトコル/ネットワーク アドレス/ポート) の使用は 1 つだけ許可されます。

リージョン 2 でコードを実行するとエラーが発生します。

ただし、リージョン 1 でコードを実行すると、すべてが期待どおりに機能し、MATLAB で問題なくデータを受信します。


これが私のMATLABコードです。このコードを他のアプリケーションで使用したことがあるので、何か問題があるとは思えません。

fclose(instrfindall); %Close all udp objects
%UDP Configuration
udpConfig.ipAddress = '127.0.0.1';
udpConfig.portAddress = 62745;

udpObj = udp(udpConfig.ipAddress, udpConfig.portAddress, ...
    'LocalPort',        udpConfig.portAddress, ...
    'ByteOrder',        'bigEndian');

set(udpObj, 'datagramTerminateMode', 'on');
set(udpObj, 'datagramReceivedFcn', {@cbDataReceived, udpObj});

fopen(udpObj);

そしてコールバック関数:

function cbDataReceived(hObj, eventdata, udpObj)
    bytesAvailable = get(udpObj, 'BytesAvailable');
    receivedDatagram = fread(udpObj, bytesAvailable);
    disp(char(receivedDatagram));
end

では、UdpClient の場合はエラーが発生し、Socket の場合はエラーが発生しないのはなぜですか? そのエラーを回避する方法はありますか?

4

1 に答える 1