Состояние гонки порта TCP? - PullRequest
0 голосов
/ 16 апреля 2011

Я хочу запустить мою программу несколько раз, и каждый экземпляр пытается подключиться через TCP к одному и тому же порту сервера. Я намерен разрешить первому подключиться, а остальным клиентам следует попытаться подключиться к другому порту.

Я использую этот код для подключения:

TcpClient tcp;
StreamReader streamReader;
StreamWriter streamWriter;

bool success=false;
while (!success) {
  try
  {
    tcp = new TcpClient(Hostname, currentPort);

    streamReader = new StreamReader(tcp.GetStream());
    streamWriter = new StreamWriter(tcp.GetStream());
    success=true;
  } catch {
    // wait a bit...
  }
}

Теперь первый будет успешно подключен, но второй не получит исключения, но и не будет подключен. Как я могу определить, действительно ли программа подключена? Свойство tcp.Connected не работает.

1 Ответ

0 голосов
/ 16 апреля 2011

Связанное свойство может иногда возвращать true, если оно не действительно подключено. См. Msdn TcpClient.Connected :

Поскольку свойство Connected отражает только состояние соединения на момент последней операции, вы должны попытаться отправить или получить сообщение, чтобы определить текущее состояние. После сбоя отправки сообщения это свойство больше не возвращает true. Обратите внимание, что это поведение предусмотрено дизайном. Вы не можете надежно проверить состояние соединения, потому что во время между проверкой и отправкой / получением соединение могло быть потеряно. Ваш код должен предполагать, что сокет подключен, и изящно обрабатывать неудачные передачи

Я бы предложил вам программно проверить , чтобы увидеть, доступен ли порт, вместо того, чтобы полагаться на исключения.

И чтобы сделать его действительно простым для вас, поскольку вы не можете полагаться на флаг Подключен, люди обычно предлагают использовать шаблон, найденный здесь TcpClient.Connected True, но не подключенный :

...