我在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,看看问题是否持续。