嘿,所以我正在尝试使用套接字构建一个简单的局域网游戏(不是tcpclient或tcplistener,是的,我知道它们是同一个东西)。我设法让聊天工作,现在我正试图让游戏工作。我在某处读到,管理游戏数据的最佳方式是通过服务器上的另一个端口(如果有人可以建议更好的方式,请随意这样做)。
我会尽可能地直截了当,所以我会发布一些代码片段,这样你就可以得到一般的想法。 (顺便说一下,我不是c#guru,这是我的第一个插座项目,所以请理解我的新生活)
服务器初始化如下:
sv = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
ip = new IPEndPoint(IPAddress.Parse(b.ToString()), 1000);
sv.Bind(ip);
(b是我的本地IP)
使用sv.SendTo()发送消息;
现在我在客户端上:
svIp = new IPEndPoint(IPAddress.Parse(txtIp.Text.Trim()), 1000);
和一个侦听传入数据的线程(像这样smt):
rcv = sv.ReceiveFrom(data, ref svIp);
根据我的理解,客户端正在侦听服务器从端口1000发送给它的所有内容。我希望到目前为止我是对的,因为这就是聊天客户端似乎的工作方式。
好的,之后,我在服务器上创建了另一个绑定到端口1001的套接字服务器:
gameIp = new IPEndPoint(IPAddress.Parse(b.ToString()), 1001);
现在我想从新的套接字服务器发送消息,让我们称之为gameSv,所以我使用gameSv.SendTo()向客户端发送消息;根据我的理解发送,应该是来自端口1001的消息,客户端不应该接收该消息,因为他只是在侦听来自端口1000的数据。
好的,好到目前为止(我希望),在此之后我创建另一个线程,它侦听来自端口1001上的服务器的数据。所以现在当我从端口1001发送消息时,侦听端口1000的线程获取它,如果我发送另一条消息,另一个线程监听端口1001得到它而另一个没有,等等,它从一个到另一个。
知道为什么会发生这种情况以及如何解决这个问题? Thx提前。
答案 0 :(得分:3)
听起来你的端口很混乱。您用来发送消息的端口无关紧要。 SendTo
的第二个参数确定将消息发送到哪个端口。这必须匹配客户端正在侦听的端口。
答案 1 :(得分:1)
Socket只能接收针对套接字绑定的端口的消息。要使用Bind()方法执行此操作。
传递给ReceiveFrom()的IPEndPoint仅用于保存从中接收消息的远程地址。它不来过滤从哪个端口/地址接收数据。