2013-06-16 3 views
2

Создание программы, которая может передавать встроенные строки между двумя компьютерами.VB Socket Exception Issue - Порты

После рытья и изменения синтаксиса, я, наконец, смог увидеть этот сокет исключение:

System.Net.Sockets.SocketException (0x80004005): Only one usage of each socket address (protocol/network address/port) is normally permitted 
    at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) 
    at System.Net.Sockets.Socket.Bind(EndPoint localEP) 
    at System.Net.Sockets.TcpListener.Start(Int32 backlog) 
    at System.Net.Sockets.TcpListener.Start() 
    at ChatProgFinal.chatForm.serverMode() 

порт, который я использую 11337. По NetStat, я не использую этот порт, поэтому я не уверен, как иначе я мог бы избавиться от этого исключения.

Вот мой serverMode блок:

Public Sub serverMode() 
    Try 
     Dim server As TcpListener = Nothing 
     server = New TcpListener(LocalIPEndPointAnyIP) 
     server.Start() 
     Dim incomingClient As TcpClient = server.AcceptTcpClient() 

     Do While isAlive = True And incomingClient.Connected = True 
      stream = incomingClient.GetStream() 
      If stream.CanRead Then 
       RaiseEvent DataReceived(stream) 
      End If 
      If incomingClient.Connected = False Then 
       RaiseEvent statusCheck("Disconnected") 
       isAlive = False 
       server.Stop() 
      End If 
     Loop 
    Catch e As Exception 
     RaiseEvent statusCheck(e.ToString) 
     Using outfile As New StreamWriter(docPath + "\log.txt") 
      outfile.Write(e.ToString) 
     End Using 
    Finally 
     stream.Close() 
    End Try 
End Sub 

Спасибо за любые советы вы можете предоставить по этому вопросу. Боковой вопрос: я не уверен, как тестировать/отлаживать программное обеспечение, которое обменивается данными между двумя компьютерами через Visual Studio 2010. Что я сейчас делаю, это опубликовать его и развернуть на тестовую виртуальную машину. У кого-нибудь есть другие методы, которые я мог бы использовать?

+2

Только один разъем * может прослушивать определенный номер порта в любом процессе на машине. Поэтому простые объяснения состоят в том, что по какой-то причине вы можете вызывать метод serverMode() более одного раза. Или вы запускаете свою программу более одного раза. Начните с установки точки останова при вызове метода Start() и убедитесь, что он только разрывается один раз. –

+0

@ Hans Passant, я провел несколько тестов с тех пор, как вы в последний раз помогали с этим вопросом. Надеюсь, вы все равно сможете помочь. По моим точкам разрыва блок кода для сервера появляется только один раз. Кроме того, я рассмотрел возможность закрытия порта на моей основной машине, поэтому вместо этого я развернул его на отдельный ноутбук. Те же результаты без брандмауэра. В моих журналах это означает, что «соединение не может быть сделано, потому что целевое устройство активно отказалось от него», которое я получал. Попробовал несколько решений там (Измененные порты и т. Д.) Еще раз спасибо, если вы можете помочь. Я отправлю полный вопрос, если мне нужно – Gith

+0

Это совершенно другое исключение из того, о котором вы задали свой вопрос. Трудно представить, как вы считаете эти «те же результаты». «Активно отказано», как правило, является проблемой межсетевого экрана. Попросите администратора вашей локальной сети помочь вам. –

ответ

0

В соответствии с комментарием Ханса вы, вероятно, звоните serverMode более одного раза в течение жизни вашей программы. Единственное, что я заметил, это то, что в вашем блоке finally вы не вызываете .Stop на свой сервер, что означает, что он может выйти из serverMode, не закрывая его. Как только это произойдет, повторные вызовы для запуска сервера, скорее всего, не удастся.

+0

Спасибо всем, кто ответил на мой вопрос. :) Я дважды проверю поток программы и быстро отправлю отчет. – Gith