2013-04-18 3 views
0

Я пытаюсь написать простую 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, а не получать ее в случае сокета? Есть ли способ избежать этой ошибки?

ответ

1

Я понимаю, что вы используете один и тот же порт для MATLAB и C# на одном компьютере. Таким образом, операционная система не позволяет открывать один и тот же порт из разных приложений.

UDP позволяет отправлять и принимать датаграммы из разных портов, поэтому использовать разные порты для разных приложений, если оба приложения работают на одном компьютере.

UdpClient sendingClient = new UdpClient(62746); // Some different port to listen 
sendingClient.Send(sendBytes, sendBytes.Length, ipEndPoint); 
+0

Работал отлично, когда использовал ipEndPoint так же, как в регионе 1. Спасибо. – HebeleHododo