gpt4 book ai didi

c# - 为什么从我的代码中删除 TextBox.AppendText() 会更改此处的套接字通信?

转载 作者:行者123 更新时间:2023-11-28 05:37:39 24 4
gpt4 key购买 nike

我在 C++ 和 C# 之间有一个简单的客户端/服务器通信,其中 C# 程序向 C++ 发送一个字符串。字符串的发送分 3 个阶段完成。发送字符串长度-->发送字符串长度-->发送字符串。出于调试目的,我在我的 C# 程序中有一个名为 textbox1 的文本框来打印对于发送的三个值,使用 textbox1.AppendText() 三次发送的值。一切都已正确发送和接收,当我从我的代码中删除三个 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] = '\0';
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] = '\0';
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] = '\0';
printf("%s:%d Your Android ID is - %s \n", inet_ntoa(address.sin_addr), ntohs(address.sin_port), AndroidID);
}

我知道我可以容纳 TextBox,只要它能工作,但它太奇怪了,我想知道对此的解释是什么。谢谢。

最佳答案

您假设数据将在一次 recv 调用中接收(或者,一次发送对应一次接收)。这是一个错误的假设。您需要继续阅读,直到您阅读了 length 个字节的数据。 TCP 没有内置任何消息传递,它只处理流。

添加该行可能意味着添加了一些小的延迟,这使得接收在单个调用中发生——这很难说,因为你正在处理一些不太确定的事情。正确处理 TCP,并查看问题是否仍然存在。

关于c# - 为什么从我的代码中删除 TextBox.AppendText() 会更改此处的套接字通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37875787/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com