我对套接字编程非常陌生。
我正在使用以下代码接收来自病理机器的传入数据。
byte[] buffer = new byte[2048];
IPAddress ipAddress = IPAddress.Parse(SERVER_IP);
IPEndPoint localEndpoint = new IPEndPoint(ipAddress, PORT_NO);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
sock.Connect(localEndpoint);
}
catch (Exception ex)
{
throw ex;
}
int recv = 0;
string Printed = string.Empty;
StringBuilder sb = new StringBuilder();
while ((recv = sock.Receive(buffer)) > 0)
{
if (sock.Receive(buffer).ToString().Length > 1) // I used this line because it's receiving some garbage value all the time.
{
sb.Append(Encoding.UTF8.GetString(buffer));
}
else
{
if (sb.Length > 50 && Printed == string.Empty)
{
Console.WriteLine(sb);
Printed = "Y";
}
}
}
我面临的问题
- 我的程序未接收完整的数据。也许是因为这一行
if (sock.Receive(buffer).ToString().Length > 1)
。但我使用了这条线,因为它总是在接收一些东西。 - 我的程序进入无限循环。我正在寻找在接收数据后应停止一段时间并再次开始监听新传入数据的程序。
最佳答案
这里有一些事情;
- 您需要存储读取计数,并仅使用那么多字节,即
var bytes = sock.Receive(buffer);
(并使用bytes
进行 EOF 测试以及要处理的字节数) - 我们不能在这里使用
ToString().Length > 1
,因为它是一个整数,并且每个整数作为字符串,都具有非零长度;相反,简单地:if (bytes > 0)
(细节:有一种情况,打开的套接字可以返回零而不意味着 EOF,但是......它不在此申请) - 即使对于文本协议(protocol),您也不一定简单地使用
Encoding.UTF8.GetString(buffer, 0, bytes)
,因为UTF8是多字节编码,意思是:你可能有部分字符;此外,您还不知道这是一条消息、半条消息还是 14 位消息;您需要阅读协议(protocol)的“框架” - 这可能只是意味着“缓冲字节,直到您看到换行符('\n'
)字符,通过编码解码这些缓冲字节,处理该消息,然后重复”
关于c# - 使用 Socket 从机器接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69340946/