感谢您提前阅读和回答!
我编写了一个简单的 C# 程序,通过套接字与第三方工具连接。每当我发送超过 1024 个字符的字符串时,第三方软件就会抛出错误。现在,我试图查明这是我的套接字代码问题还是其他软件 (EnergyPlus) 的问题。
只有几行代码,如果有人有建议,将不胜感激!
using System.IO;
using System.Net;
using System.Net.Sockets;
...
private int port = 1410;
private TcpListener listener;
private Stream s;
private StreamReader sr;
private StreamWriter sw;
private Socket soc;
...
真正开始的地方是:
listener = new TcpListener(port);
listener.Start();
soc = listener.AcceptSocket();
// now, the other program connects
soc.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout, 10000);
s = new NetworkStream(soc);
sr = new StreamReader(s);
sw = new StreamWriter(s);
sw.AutoFlush = true; // enable automatic flushing
sw.WriteLine("more or less than 1024 characters");
...
这是我使用的代码。我有什么忘记的吗?有什么我应该注意的吗? 我很高兴收到任何建议。
我从 E+ 得到的错误如下:
ExternalInterface: Socket communication received error value " 1" at time = 0.00 hours.
ExternalInterface: Flag from server " 0".
最佳答案
您需要查看 EnergyPlus 定义的规范; 任何套接字通信都需要规则。这里有两个明显的选择:
- 你没有遵守规则(可能是长度有限,或者你需要为这种情况编写特殊的标记字节)
- 他们的服务器代码没有正确实现规范(最大的原因是:缓冲区问题,或者:假设逻辑帧到达单个网络数据包)
实际上,我发现它正在做任何事情 很有趣,因为那里没有明显的“框架”; TCP是一个流,所以你通常需要帧来划分逻辑消息。这通常意味着以下之一:
- 一个长度前缀,有或没有其他头数据
- cr/lf/crlf 终止符(或其他终止符),通常用于基于文本的协议(protocol)
- 关闭套接字(最终终结者)
这些你都不做,所以在我写的任何服务器中,在其他事情发生之前,这将是一个不完整的消息。听起来是基于文本的;我会尝试添加一个 cr/lf/crlf
关于c# - Windows 上的套接字 - 我是否遗漏了程序中的某些内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9240699/