为什么从我的代码中removig textbox.appendtext()在此处更改套接字通信



我在C 和C#之间有一个简单的客户端/服务器通信,其中C#程序将字符串发送到C 。字符串的发送是在3个阶段完成的。发送字符串长度的长度 ->发送字符串的长度 ->发送字符串。为了调试目的,我在我的C#程序上有一个称为TextBox1的文本框使用textbox1.appendtext()发送的三个值发送的三个值。一切都正确地发送并收到了,当我从代码中删除三个附录文字()行中的两条中的两条时,它仍然有效,但奇怪的是,当我删除第三个(评论为//<--This Line时,C 服务器都会收到0!

c#客户端(代码段):

 private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                MemoryStream ms;
                NetworkStream ns;
                TcpClient client;
                BinaryWriter br;
                byte[] tosend;
                string AndroidId = "2468101214161820";
                string len = AndroidId.Length.ToString();
                string lol = len.Length.ToString();
                ms = new MemoryStream();
                client = new TcpClient("127.0.0.1", 8888);                
                ns = client.GetStream();
                br = new BinaryWriter(ns);
                //****************Send Length Of Length***************
                tosend = System.Text.Encoding.ASCII.GetBytes(lol);
                br.Write(tosend);
                textBox1.AppendText(Encoding.ASCII.GetString(tosend));//<---THIS LINE
                //****************Send Length***************
                tosend = System.Text.Encoding.ASCII.GetBytes(len);
                br.Write(tosend);
                //****************Send Length Of Length***************
                tosend = System.Text.Encoding.ASCII.GetBytes(AndroidId);
                br.Write(tosend);
                ns.Close();
                client.Close();
            }

C 服务器代码段:

//***********Recieve Length Of Length*****************
                char* lol_buff0 = new char[1];
                int nullpoint=  recv(s, lol_buff0, strlen(lol_buff0), 0);
                lol_buff0[nullpoint] = '';
                int lengthoflength = atoi(lol_buff0);
                //***********Recieve Length*****************
                char* l_buff0 = new char[lengthoflength];
                int nullpoint2=recv(s, l_buff0, strlen(l_buff0), 0);
                l_buff0[nullpoint2] = '';
                int length = atoi(l_buff0);
                //***********Recieve AndroidID*****************
                char* AndroidID = new char[length];
                valread0 = recv(s, AndroidID, strlen(AndroidID), 0);
                if (valread0 == SOCKET_ERROR)
                {
                    int error_code = WSAGetLastError();
                    if (error_code == WSAECONNRESET)
                    {
                        //Somebody disconnected , get his details and print
                        printf("Host disconnected unexpectedly , ip %s , port %d n", inet_ntoa(address.sin_addr), ntohs(address.sin_port));
                        //Close the socket and mark as 0 in list for reuse
                        closesocket(s);
                        client_socket[i] = 0;
                    }
                    else
                    {
                        printf("recv failed with error code : %d", error_code);
                    }
                }
                if (valread0 == 0)
                {
                    //Somebody disconnected , get his details and print
                    printf("Host disconnected , ip %s , port %d n", inet_ntoa(address.sin_addr), ntohs(address.sin_port));
                    //Close the socket and mark as 0 in list for reuse
                    closesocket(s);
                    client_socket[i] = 0;
                }
                else
                {
                    //add null character, if you want to use with printf/puts or other string handling functions
                    AndroidID[valread0] = '';
                    printf("%s:%d  Your Android ID is - %s n", inet_ntoa(address.sin_addr), ntohs(address.sin_port), AndroidID);
                }

我知道,只要有效,我就可以容纳文本框,但是它很奇怪,我想知道这是什么解释。谢谢。

您假设将在一个recv呼叫中接收数据(或者,或者,该发送的发送对应于一个接收)。那是一个错误的假设。您需要继续阅读,直到您阅读数据字节的长度。TCP内置没有任何消息传递,它仅处理流。

添加该行可能意味着添加了一些小延迟,这使得接收到一个呼叫中发生 - 很难说,因为您正在处理并非完全确定性的事情。正确处理TCP,看看问题是否持续。

最新更新