2011-10-25 11 views
1

私は次の設定をしています: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呼び出しを使用してデータグラムソケット上で送信する場合)ソケットが接続されていないため、データを送信または受信するための要求を許可しないアドレスが

を供給しませんでしたこれは適切なアプローチですが、誰かにデータを読み取るためにソケットに接続する必要がありますか?

+0

エラーとして、ソケットには接続がありません...送信しているデータでソケットに何をしたいのですか?それをバッファリングする?それを捨てる? – Yahia

+0

データはリアルタイムで表示されるので、データを読みたいクライアントは、そのポートに接続して、そこに書き込まれているものを読み取る必要があります。私はTCPソケットが最良のアプローチであるかどうかはわかりませんが、私はオンラインストリーミングに似たものを求めています。 – dcarneiro

+1

データの損失が許容される場合は、UDPブロードキャスト(「コネクションレス」)を強くお勧めします。これは「無線」のように機能し、聞きたい人は聞くポートを知るだけです。 – Yahia

答えて

1

UDPブロードキャストは、接続を確立する必要がない場合のコメントとして使用できます。サーバーjustsは1つのポートでデータを送信し、関心のあるクライアントはそのポートでそのデータを受信できます。

デバイスを区別したい場合は、デバイスのすべてのデータを別のポートにブロードキャストする必要があります。それはあなたが多くのデバイスを持っていると(不必要な)ネットワークトラフィックが多いかもしれません。

もう1つのオプションはTCPを使用しています。 サーバーにあなたのクライアントからの着信接続をリッスンするよう:あなたはclientsocketへのアクセス権を持っているし、上、後にデータを送信するためにどこかのソケットにデータを送信したり、参照を格納することができますOnAcceptので

_socket.Bind(new IPEndPoint(IPAddress.Any, 1234)); 
_socket.Listen(10); 
_socket.BeginAccept(onAccept, _socket); 

private static void onAccept(IAsyncResult ar) 
{ 
    Socket clientSocket = ((Socket) ar.AsyncState).EndAccept(ar); 

    // begin to accept the next client connection 
    _socket.BeginAccept(onAccept, _socket); 

    // this is the socket you can send data to the connected client: 
    clientSocket.Send(data); 
} 

TCPアプローチには、接続されたクライアントがあり、サーバーが接続されているクライアントの数を認識している場合にのみ、サーバーがデータを送信するという利点があります。

+0

私はデバイスを区別したいが、最悪の場合は7であり、BTはより多くの接続を許可しないからです。 TPCのアプローチは簡単なようです。 – dcarneiro

1

TCPを使用する場合、Bind()に電話する必要はありませんが、Connect()に電話する必要があります。

_socket.Connect(endPoint); 

これはあなたのコード_localIp内のIP接続したいローカルネットワーク上のアドレスではなくあなたが使用したいローカルコンピュータのネットワークアダプタのIPアドレスがあることを前提としてい接続。

Bind()とは、ソケットをローカル(つまり、現在のコンピュータ上の)エンドポイントにバインドすることです。どのネットワークアダプタが使用されているか(システムがターゲットIPに基づいて決定することを意味する)を気にせず、どのローカルポートが使用されても構わない場合は、Bind()に電話する必要はありません。

+0

_localIpはローカルコンピュータのIPです。私はbind()を使って現在のコンピュータに空きポートを割り当てます。私はどのポートが使われているかは気にしません。私はちょうど自由なポートがそこにデータを送信して、他のコンピュータがそれをフェッチできるようにしたいのです。 – dcarneiro