Сокеты на Windows - я что-то пропустил в своей программе? - PullRequest
2 голосов
/ 11 февраля 2012

Спасибо, что прочитали и ответили заранее!

Я написал простую программу на 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 Ответ

1 голос
/ 11 февраля 2012

Ю нужно посмотреть спецификацию, определенную EnergyPlus; любой сокет связи требует правил. Здесь есть два очевидных варианта:

  1. вы не следуете правилам (возможно, это ограниченная длина или, возможно, вам нужно написать специальные байты маркера для этого сценария)
  2. их серверный код неправильно реализует спецификацию (основные причины: проблемы с буфером или: если логический кадр поступает в одном сетевом пакете)

На самом деле, мне интересно, что он пока что делает что-нибудь , поскольку там нет явной "рамки"; TCP - это поток, поэтому обычно вам нужны фреймы для разделения логических сообщений. Обычно это означает одно из:

  • префикс длины с другими данными заголовка или без них
  • терминатор cr / lf / crlf (или другой терминатор), обычно для текстовых протоколов
  • закрытие сокета (конечный терминатор)

Вы не делаете ничего из этого, поэтому на любом сервере, который я пишу, это будет неполным сообщением, пока что-то еще не произойдет. Звучит на основе текста; Я бы попробовал добавить cr / lf / crlf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...