我有一些接收一系列消息的代码:
byte[] buffer = new byte[10240]; //... sock.Receive(buffer); string response = message(buffer); Console.WriteLine("Message Recieved"); if (!verifyUser(response, sock)) Console.WriteLine("User Invalid"); //... static private bool verifyUser(string userString, Socket sock) { string[] userData = userString.Split(' '); int i = 0; while (true) { if (userData[0].ToUpper() != "USER") { byte[] buffer = message("WHO"); sock.Send(buffer); userData = userString.Split(' '); i++; if (i > 4) { return false; } continue; } else break; } Console.WriteLine("Connection recieved from " + userData[1] + " with hash of "/* + userData[2]*/); }
我遇到的问题是,如果我提交用户名unkwntech所有显示它unkwnt,第二个值似乎永远不会到达那里.发送数据的应用程序如下所示:
static void Main(string[] args) { Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); EndPoint remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 200); sock.Connect(remoteEP); byte[] buffer = Encoding.ASCII.GetBytes("USER unkwntech a3f5h4a35sfg");//Made up hash sock.Send(buffer); sock.Receive(buffer); Console.WriteLine(Encoding.ASCII.GetString(buffer)); Console.ReadLine(); }
Jon Skeet.. 7
您假设在发送时,所有数据都以一个数据包结束,并且您将在另一端收到所有数据.这不是TCP/IP的工作原理.这是一个流媒体协议 - 您永远不应该假设您一次会收到多少数据.
基本上你需要从流中读取,直到你读完所有数据并且套接字已经关闭,或者直到你得到"足够"的数据.如果您控制协议并且它是一个会话协议,那么如果您发送的每条消息都以其长度为前缀,它会使生活变得更加容易 - 这意味着另一端知道预期会有多少数据.
您假设在发送时,所有数据都以一个数据包结束,并且您将在另一端收到所有数据.这不是TCP/IP的工作原理.这是一个流媒体协议 - 您永远不应该假设您一次会收到多少数据.
基本上你需要从流中读取,直到你读完所有数据并且套接字已经关闭,或者直到你得到"足够"的数据.如果您控制协议并且它是一个会话协议,那么如果您发送的每条消息都以其长度为前缀,它会使生活变得更加容易 - 这意味着另一端知道预期会有多少数据.