Я пытаюсь написать простую UDP-программу на C#, которая отправляет и получает данные на localhost. Я новичок в C#, но гораздо лучше в MATLAB, поэтому вместо того, чтобы писать сервер и клиент в C#, я решил отправить данные с помощью C# и получить их в MATLAB.Почему я не могу получить текст, отправленный на localhost, используя UdpClient в C#?
Я пробовал два подхода к отправке данных. Использование класса Socket сработало, но с использованием класса UdpClient не удалось.
Перед запуском этого кода я запустил код MATLAB, чтобы установить функцию обратного вызова для печати принятой дейтаграммы.
В каждом из них действует только один регион. Я комментирую другой.
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
}
}
}
Я получаю
Только одно использование адреса сокета (протокол/сетевой адрес/порт) обычно разрешается
ошибку при запуске кода в области 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, а не получать ее в случае сокета? Есть ли способ избежать этой ошибки?
Работал отлично, когда использовал ipEndPoint так же, как в регионе 1. Спасибо. – HebeleHododo