Windows上的套接字 - 我的程序中是否遗漏了一些内容?

时间:2012-02-11 13:46:48

标签: c# windows sockets

感谢您提前阅读和回答!

我写了一个简单的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".

1 个答案:

答案 0 :(得分:1)

Yu需要查看EnergyPlus定义的规范; 任何套接字通信都需要规则。这里有两个明显的选择:

  1. 您没有遵守规则(可能是有限长度,或者您可能需要为此方案编写特殊标记字节)
  2. 他们的服务器代码没有正确实现规范(最大的原因是:缓冲区问题,或者:假设逻辑帧到达单个网络数据包)
  3. 实际上,我觉得有趣的是它正在做任何,因为那里没有明显的“框架”; TCP是一个流,因此您通常需要帧来划分逻辑消息。这通常意味着以下之一:

    • 长度前缀,带或不带其他标题数据
    • 一个cr / lf / crlf终结符(或其他终止符),通常用于基于文本的协议
    • 关闭套接字(终极终结符)

    你没有这些,所以在我写的任何服务器中,在发生其他事情之前,这将是一个不完整的消息。它听起来像基于文本;我想尝试添加一个cr / lf / crlf