C#アプリケーションとC#アプリケーションを通信するためにUDPソケットを使用しています。C++とC#のソケットが正しく動作しない
C#→C++の方向ではすべてがうまくいっているようですが、それ以外の方法は私をナットとするものです。
コミュニケーションは機能しますが、C#アプリケーションでメッセージが送信されていても(3Dアプリケーション)、受信コードは10ミリ秒ごとに実行されています(2秒遅れなど) 。
これは非常に苦しい問題ですので、リアルタイムが必要です。これはパケット損失に関連すると思われますか?それでは、彼らは他の方向に迷子にならないのはなぜですか?
EDIT:データを同期するための
C#アプリケーションコード:データを送信するため
public void RecibeDatos()
{
if (MessageReceived && U != null && S != null)
{
MessageReceived = false;
//Console.WriteLine("listening for messages");
U.BeginReceive(ReceiveCallback, S);
}
}
public void ReceiveCallback(IAsyncResult ar)
{
UdpClient u = ((UdpState)(ar.AsyncState)).U;
IPEndPoint e = ((UdpState)(ar.AsyncState)).E;
receivedBytes = u.EndReceive(ar, ref e);
//int currentProtocol = (int) numero;
//ResetSignal = reset > 0;
//Console.WriteLine("Received: " + currentProtocol);
MessageReceived = true;
}
C++コード:
float indiceFloat[1];
indiceFloat[0] = indice_protocolo_actual;
sender->setBuffer((void *)indiceFloat, sizeof(indiceFloat));
sender->sync();
J_Enviar(送信者)クラスの同期方法:
void J_Enviar::sync(void)
{
if(!_initialized) init();
if(_buffer == 0L)
{
fprintf(stderr, "Broadcaster::sync() - No buffer\n");
return;
}
#if defined (WIN32) && !defined(__CYGWIN__)
unsigned int size = sizeof(SOCKADDR_IN);
sendto(_so, (const char *)_buffer, _buffer_size, 0, (struct sockaddr *)&saddr, size);
int err = WSAGetLastError();
if (err!=0)
fprintf(stderr, "Broadcaster::sync() - error %d\n",err);
#else
unsigned int size = sizeof(struct sockaddr_in);
sendto(_so, (const void *)_buffer, _buffer_size, 0, (struct sockaddr *)&saddr, size);
#endif
}
Pr C#の終わりを受信するための完全なSocketManagerコードをoviding:
using System;
using System.Net;
using System.Net.Sockets;
namespace WpfApplication1
{
public class SocketManager
{
private static SocketManager _instance = null;
static readonly object Padlock = new object();
private IPEndPoint E;
private UdpClient U;
private UdpState S;
private byte[] receivedBytes;
public static bool MessageReceived = true;
private SocketManager()
{
}
public byte[] ReceivedBytes
{
get { return receivedBytes; }
}
public static SocketManager Instance
{
get
{
lock(Padlock)
{
return _instance ?? (_instance = new SocketManager());
}
}
}
public void CreateReceivingSocket(IPAddress a, int puerto)
{
if(E==null || (E.Address != a && E.Port != puerto))
{
E = new IPEndPoint(a, puerto);
U = new UdpClient(puerto);
S = new UdpState { E = E, U = U };
}
}
public void ReceiveCallback(IAsyncResult ar)
{
UdpClient u = ((UdpState)(ar.AsyncState)).U;
IPEndPoint e = ((UdpState)(ar.AsyncState)).E;
receivedBytes = u.EndReceive(ar, ref e);
//int currentProtocol = (int) numero;
//ResetSignal = reset > 0;
//Console.WriteLine("Received: " + currentProtocol);
MessageReceived = true;
}
public void RecibeDatos()
{
if (MessageReceived && U != null && S != null)
{
MessageReceived = false;
//Console.WriteLine("listening for messages");
U.BeginReceive(ReceiveCallback, S);
}
}
public void CloseConnection()
{
if (E != null)
{
E.Port = 5502;
E = null;
}
if (U != null)
U.Close();
}
}
public class UdpState
{
public IPEndPoint E;
public UdpClient U;
}
}
を、これはプログラムを作る私のdispatchertimerclickでは、各10ミリ秒を受け取る:私はあなたが最初のBeginReceiveをキックオフするとき
_dispatcherTimer.Tick += DispatcherTimerTick;
_dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 1);
_dispatcherTimer.Start();
private void DispatcherTimerTick(object sender, EventArgs e)
{
_exp1Class.sendData();
_sm.RecibeDatos();
byte[] recibidos = _sm.ReceivedBytes;
if (recibidos != null)
{
float numero = BitConverter.ToSingle(recibidos, 0);
_exp1Class.CurrentProtocol = (int) numero;
}
}
あなたが間違っていることがありますが、問題が何に関連しているかを把握するための詳細やコードは提供していません。 –
[Wireshark](http://www.wireshark.org/)のようなプログラムで未処理のパッケージをチェックしてください。それは実際の遅延がどこにあるのかを判断するのに役立ちます。 –
C#側で受信するコードを提供できますか?また、パケットレベルで何が起きているかを証明するためにWiresharkトレースを実行することで利益を得ることができます。コードを提供するために編集された –