Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅套接字接收消息C的一部分#_C#_Sockets - Fatal编程技术网

C# 仅套接字接收消息C的一部分#

C# 仅套接字接收消息C的一部分#,c#,sockets,C#,Sockets,我有一段代码正在接收一系列消息: 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 veri

我有一段代码正在接收一系列消息:

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();
        }
您假设当您发送时,所有数据都以单个数据包结束,并且您将在另一端一次性接收所有数据。TCP/IP不是这样工作的。这是一个流协议——你永远不应该假设你一次会收到多少数据

基本上,您需要从流中读取数据,直到您读取了所有数据并关闭了套接字,或者直到您获得了“足够”的数据。如果您控制协议,并且它是一个对话协议,那么如果您发送的每条消息都以其长度作为前缀,那么它会让您的生活变得更加轻松-这意味着另一端知道需要多少数据。

您假设当您发送时,所有数据都以单个数据包结束,你将在另一端一次性收到所有数据。TCP/IP不是这样工作的。这是一个流协议——你永远不应该假设你一次会收到多少数据


基本上,您需要从流中读取数据,直到您读取了所有数据并关闭了套接字,或者直到您获得了“足够”的数据。如果您控制该协议,并且该协议是一种对话协议,那么如果您发送的每条消息都以其长度作为前缀,则会使您的生活更加轻松—这意味着另一端知道需要多少数据。

检查套接字的返回值。接收呼叫。它返回接收到的字节数。您可以将此调用放入循环并读取,直到获得预期的字节数。您还应该通过设置最大尝试次数来防止无限循环,或者按照John的建议,检查套接字的状态。另外,不要假设返回值为零表示您已经阅读了整个消息

如果您的协议的每条消息都以其长度作为前缀,那么为了真正防弹,您的协议还应该定义一个标记字节来标记前缀长度头的结尾。每次读取一个字节,直到看到标记字节。然后计算消息的长度,并分大块阅读,直到你全部阅读完毕


Receive定义一个重载,用于指定要接收的字节数。(但是,您不能保证收到那么多,因此您仍然必须检查返回值。)

检查套接字的返回值。接收呼叫。它返回接收到的字节数。您可以将此调用放入循环并读取,直到获得预期的字节数。您还应该通过设置最大尝试次数来防止无限循环,或者按照John的建议,检查套接字的状态。另外,不要假设返回值为零表示您已经阅读了整个消息

如果您的协议的每条消息都以其长度作为前缀,那么为了真正防弹,您的协议还应该定义一个标记字节来标记前缀长度头的结尾。每次读取一个字节,直到看到标记字节。然后计算消息的长度,并分大块阅读,直到你全部阅读完毕


Receive定义一个重载,用于指定要接收的字节数。(但是,不能保证您会收到那么多,因此您仍然需要检查返回值。)

能否显示“message”函数的定义?你调试过应用程序了吗?数据何时丢失?您能给出“消息”功能的定义吗?你调试过应用程序了吗?数据何时丢失?