当前位置: 首页 > 编程语言 > C#

在C#中的同一套接字上发送和接收数据共享

时间:2023-04-10 14:13:45 C#

在C#中的同一套接字上发送和接收数据我正在尝试使用套接字(System.Net.Socket,甚至尝试过TcpListener/Client/Etc.)在等待或已经发送数据时监听数据。我做了以下操作:publicbyte[]bytesIn;公共字节[]bytesOut;公共套接字发送器;公共套接字接收器;publicComlink(StringipAddress,intportNum){try{IPEndPointremoteEP=newIPEndPoint(IPAddress.Parse(ipAddress),11000);变送器=新套接字(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);变送器.Listen(10);接收器=发射器。接受();接收器。接收(字节输入);尝试{transmitter.Connect(remoteEP);this.bytesOut=Encoding.ASCII.GetBytes("");intbytesSent=transmitter.Send(this.bytesOut);this.connected=true;}}//(省略了我的异常处理。)}Receive()函数:this.bytesIn=newbyte[1024];套接字接收器=transmitter.Accept();intbytesReceived=receiver.Receive(this.bytesIn);绑定它的代码:while(comlink.connected){comlink.Receive();handlePacket(comlink.bytesIn);我只是不完全确定我是否使用了正确的流程来接收数据,因为这一直是.NET的抱怨。我需要处理数据。就像一条双向街道:数据自由进入(程序不必返回到Receive()并等待数据),它会得到处理。数据也可以从客户端自由移动到服务器。我知道TCP套接字是双向的,但我需要改进这个类,这样我才能享受自由开放之路的全部好处。仅显示您显示的代码至少有两个问题。首先,您的套接字应该用于侦听或连接到远程套接字,但不能同时用于两者。坦率地说,令我感到惊讶的是,当代码已经处于侦听模式后尝试调用Connect()时,.NET不会抛出异常。其次,您只需要接受一次连接。在每次调用Receive()之前接受是错误的,这将导致代码仅从与其连接的每个套接字接收第一个缓冲区的数据。通常,基于套接字的实现需要一个“服务器”和一个“客户端”。请注意,一旦建立了联系,角色就不需要保持如此牢固的建立。但它们首先是至关重要的。服务器将创建一个新的“侦听”套接字。使用此套接字,它将“接受”来自客户端的连接请求,该进程将创建实际用于通信的新套接字。我再说一遍:服务器的原始套接字从不用于通过连接进行的实际通信。它只是用于创建连接的套接字。客户端将创建一个套接字。使用这个套接字,它将尝试“连接”到服务器的套接字。建立连接后,将使用同一个套接字进行实际通信。如您所知,TCP连接是双向的。因此,一旦建立连接,服务器和客户端就可以使用它们的单套接字连接来发送和接收数据。当然,请注意,您不能在单线程代码中同时执行这两项操作。因此,您的高级协议需要是一种调用和响应类型的协议,其中每个端口都确切地知道何时需要发送或接收数据,并且永远不需要同时执行这两项操作,或者您需要使用.NET作为其中之一套接字提供的异步API,以便您可以同时处理发送和接收。MSDN有很好的套接字编程示例。你应该从那里开始。很久以前(反正在互联网时代:)),我写了一系列博客文章,试图帮助人们开始使用.NETSocket编程。这是我没时间写的少数几件事之一;如果对你有帮助,不妨考虑看看:http://blogs.msmvps.com/duniho/2008/08/19/basic-network-programming-in-net/以上是C#学习教程:send+在C#中的同一个套接字上接收数据共享。如果对你有用,需要了解更多C#学习教程,希望大家多多分享注意——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: