2012-02-11 82 views
2

感谢您的阅读和提前回答!Windows上的套接字 - 我错过了我程序中的某些东西吗?

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

将有助于了解错误,这是抛出。虽然看起来不像是你的错。 – 2012-02-11 13:51:01

+0

协议规范是否涵盖长字符串? – 2012-02-11 13:52:53

+0

@MarcGravell:你的意思是WinPocket等的协议或EnergyPlus的协议?第二个在网上没有可访问的规范。但他们有我会联系的帮助台。但我想先确定我的代码。 – Teetrinker 2012-02-11 14:01:44

回答

1

郁需要看通过的EnergyPlus所规定的规范; 任何套接字通信需要规则。有两个明显的选择在这里:你不遵守规则(也许是有限的长度,或者你需要编写此方案专门的标志字节)

  • 他们的服务器代码未实现

    1. 正确规范(最大的原因是:缓存的问题,或者:假设逻辑框架在一个单一的网络数据包到达时)

    其实,我觉得很有意思,它是做什么然而,因为没有明显“框架”在那里; TCP是一个流,所以你通常需要帧来划分逻辑消息。这通常意味着之一:

    • 长度前缀,有或没有其它头数据
    • 一个CR/LF/CRLF终止子(或其他终止子),通常是基于文本的协议
    • 关闭套接字(最终的终结者)

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

  • +0

    要发送的字符串遵循特定的格式(这是记录),它包含有关何时到达其结束的信息。但是我没有任何关于如何处理超长字符串的信息。 /我想我的问题是关于如果通过TCP发送像这样的长字符串基本上是可以的,或者如果已经以不同的方式完成。 – Teetrinker 2012-02-11 15:42:27

    +1

    @Teetrinker是的,这里没有问题。不过,它可能会被拆分成数据包。有*是你可以在一个块中传递的上限,但是这样会大得多,并且会在你的结尾出错。听起来像他们的错误,从你说的话。 – 2012-02-11 15:45:44

    相关问题