2011-10-25 42 views
1

我有以下设置:LAN环境下的套接字通信

服务器将通过蓝牙连接到发送离散信号的多个设备。然后会有n个客户端可以查询服务器(可能通过网络服务)连接哪些设备,并从他们想要的设备收听信号。

我认为最好的实现方法是:当服务器通过BT连接到设备时,它会打开一个Socket到本地端口并在那里发送数据。当客户端询问可用设备时,服务器将返回一个字典,然后客户端只需要听该端口。

但我在套接字实现中遇到了一些问题。如何创建信号并将其写入本地端口?

这是我走到这一步:

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广播作为注释建议您不必建立连接的位置。服务器只是在一个端口上发送数据,任何感兴趣的客户端都可以在该端口上接收数据。

如果你想区分你的设备,你可能必须在一个单独的端口上广播每个设备的数据。这可能是很多(不必要的)网络流量,因为你有很多设备。

另一种选择是使用TCP。 你的服务器从客户端传入连接听:

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

在onAccept您可以访问ClientSocket的和可以发送数据或存储参考插座的地方发送数据以后:

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