私は次の設定をしています:LAN環境でのソケット通信
サーバーはBluetooth経由でディスクリート信号を送信しているいくつかのデバイスに接続します。それから、デバイスが接続されているサーバを(Webサービスを介して)問い合わせて、必要なデバイスからの信号を聞くことができるn個のクライアントが存在します。
これを実装する最良の方法は、サーバーがBT経由でデバイスに接続するときに、ローカルポートへのソケットを開いてそこにデータを送信することです。クライアントが使用可能なデバイスを要求すると、サーバーは辞書を返し、クライアントはそのポートをリッスンするだけです。
しかし、私はソケットの実装にいくつかの問題があります。信号を作成してローカルポートに書き込むにはどうしたらいいですか?
これは私がこれまでに得たものである:
class Device {
...
public EndPoint Connect() {
// create a bt connection to the device
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var endPoint = new IPEndPoint(IPAddress.Parse(_localIp), 0);
_socket.Bind(endPoint);
return endPoint;
}
private void OnBtDataReceived(object sender, wclDataEventArgs e) {
_socket.Send(e.Data);
}
}
しかし_socket.Send(e.Data)に達します。私は、次の例外を受け取る:
(のsendto呼び出しを使用してデータグラムソケット上で送信する場合)ソケットが接続されていないため、データを送信または受信するための要求を許可しないアドレスが
を供給しませんでしたこれは適切なアプローチですが、誰かにデータを読み取るためにソケットに接続する必要がありますか?
エラーとして、ソケットには接続がありません...送信しているデータでソケットに何をしたいのですか?それをバッファリングする?それを捨てる? – Yahia
データはリアルタイムで表示されるので、データを読みたいクライアントは、そのポートに接続して、そこに書き込まれているものを読み取る必要があります。私はTCPソケットが最良のアプローチであるかどうかはわかりませんが、私はオンラインストリーミングに似たものを求めています。 – dcarneiro
データの損失が許容される場合は、UDPブロードキャスト(「コネクションレス」)を強くお勧めします。これは「無線」のように機能し、聞きたい人は聞くポートを知るだけです。 – Yahia