C# 网络中的奇怪行为
这是我的代码,用于向网络上的计算机发送字符串。在类外部需要时调用Update方法。当我创建一个实例时,一切都很好,直到我按Enter键,它应该在控制台上写“Hello”,但什么也没发生。另一个问题是,当我创建该类的第二个实例时,代码被卡在C# 网络中的奇怪行为,c#,networking,xna,network-programming,C#,Networking,Xna,Network Programming,这是我的代码,用于向网络上的计算机发送字符串。在类外部需要时调用Update方法。当我创建一个实例时,一切都很好,直到我按Enter键,它应该在控制台上写“Hello”,但什么也没发生。另一个问题是,当我创建该类的第二个实例时,代码被卡在Console.WriteLine(localIp)行中,在该行中什么也没有发生。为什么会发生这种情况?我如何解决它?如果您一直在向控制台写入内容,则不会出现网络问题。但很难相信。最近有没有键入control+Q?@EJP被困在控制台上写东西不应该是一个网络问题
Console.WriteLine(localIp)
行中,在该行中什么也没有发生。为什么会发生这种情况?我如何解决它?如果您一直在向控制台写入内容,则不会出现网络问题。但很难相信。最近有没有键入control+Q?@EJP被困在控制台上写东西不应该是一个网络问题,但第一个问题显然是,我没有键入ctrl+Q。这是怎么回事?顺便说一句,我尝试在不同的计算机上运行代码。如果有用的话,每次都会发生同样的事情。
public class MultiplayerState : IState
{
Game1 game;
Socket sck;
EndPoint epLocal, epRemote;
SpriteFont font;
string localIp, remoteIp = "192.168.137.2";
int localPort = 80, remotePort = 80;
public MultiplayerState(Game1 game)
{
this.game = game;
sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sck.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
localIp = GetLocalIP();
remoteIp = localIp;
Console.WriteLine(localIp);
connect();
sendMessage("Hello");
}
private string GetLocalIP()
{
IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
return ip.ToString();
}
return "127.0.0.1";
}
void connect()
{
epLocal = new IPEndPoint(IPAddress.Parse(localIp), localPort);
sck.Bind(epLocal);
epRemote = new IPEndPoint(IPAddress.Parse(remoteIp), remotePort);
sck.Connect(epRemote);
byte[] buffer = new byte[1500];
sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);
Console.WriteLine("Connected to " + remoteIp);
}
void sendMessage(string str)
{
System.Text.ASCIIEncoding enc = new ASCIIEncoding();
byte[] msg = new byte[8000];
msg = enc.GetBytes(str);
sck.Send(msg);
}
void MessageCallBack(IAsyncResult aResult)
{
Console.WriteLine("Message received");
byte[] buffer = new byte[1500];
int size = 0;
size = sck.EndReceiveFrom(aResult, ref epRemote);
if (size > 0)
{
byte[] receivedData = new Byte[1464];
receivedData = (byte[])aResult.AsyncState;
ASCIIEncoding eEncpding = new ASCIIEncoding();
string receivedMessage = eEncpding.GetString(receivedData);
Console.WriteLine("received message:" + receivedMessage);
}
sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);
}
public void Update(GameTime gameTime)
{
if (Keyboard.GetState().IsKeyDown(Keys.Escape))
{
sck.Close();
game.gameState = new MenuState(game);
}
if (Keyboard.GetState().IsKeyDown(Keys.Enter))
sendMessage("Hello");
}
}