局域网环境中的套接字通信

本文关键字:套接字 通信 环境 局域网 | 更新日期: 2023-09-27 18:12:15

我有以下设置:

服务器将通过蓝牙连接到发送离散信号的几个设备。然后将有n个客户端可以查询服务器(可能通过web服务)连接的设备,并侦听来自他们想要的设备的信号。

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

但我有一些问题与套接字的实现。我如何创建和写入信号到本地端口?

这是我目前得到的:

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调用在数据报套接字上发送时)没有提供地址

这是正确的方法,但它需要有人连接到套接字读取数据?

局域网环境中的套接字通信

你可以使用UDP广播作为评论建议,你不需要建立一个连接。服务器只在一个端口上发送数据,任何感兴趣的客户端都可以在该端口上接收该数据。

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

另一个选项是使用TCP。您的服务器将监听来自客户端的传入连接:

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

在onAccept中,您可以访问客户端套接字,并可以发送数据或存储对套接字的引用,以便稍后发送数据:

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方法的优点是,您的服务器只在有连接的客户端并且您的服务器知道连接的客户端数量时才发送数据。

使用TCP时,不需要调用Bind(),但需要调用Connect()

_socket.Connect(endPoint);
这假设在你的代码中_localIp是你想要连接的本地网络上的IP地址,而不是你想要用于连接的本地计算机上的网络适配器的IP地址。

Bind()所做的是将套接字绑定到本地(即在当前计算机上)端点。如果您不关心所使用的网络适配器(这意味着您让系统根据目标IP来决定),并且您也不关心所使用的本地端口,则不需要调用Bind()