2013-08-21 3 views
0

Так что я все новое в этом программирования «Socket» и там, кажется, что-то я в корне неправильно поняли ...Не удается связать подключенный сокет

Документация для сервера я использую очень плохо написано , но говорит, что использует «потоковое соединение сокета», которое «основано на событиях» ... сервер находится в локальной сети.

вот мой первый наивный поток программы (не асинхронном или что-нибудь!):

.........

1) Сначала мне нужно гнездо ... нет проблем .. . Я понимаю, что :)

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

2) Тогда я соединиться с ней ... тоже не проблема :)

s.Connect("10.10.10.36", 6009); 

3) Теперь, когда я м у соединения и у меня есть новый локальный EP данного сервером ... что-то вроде «10.10.10.59:56231» ... поэтому я стараюсь Привязать к этому EP:

s.Bind (s.LocalEndPoint); 

После того, что мне нужно слушать и начать принимать соединения:

s.Listen (10); 
s.Accept(); 

.........

"s.Bind (s.LocalEndPoint);" выходит из строя (я запустил его без отладчика) с этим:

.........

Unhandled Exception: 
System.Net.Sockets.SocketException: Invalid arguments 
    at System.Net.Sockets.Socket.Bind (System.Net.EndPoint local_end) [0x00065] in /private/tmp/source/bockbuild-xamarin/profiles/mono-mac-xamarin-no-pcl/build-root/mono-3.2.0/mcs/class/System/System.Net.Sockets/Socket.cs:1115 
    at RFID.MainClass.Main (System.String[] args) [0x0002b] in /Users/jab/Projects/RFID/RFID/Program.cs:17 
[ERROR] FATAL UNHANDLED EXCEPTION: System.Net.Sockets.SocketException: Invalid arguments 
    at System.Net.Sockets.Socket.Bind (System.Net.EndPoint local_end) [0x00065] in /private/tmp/source/bockbuild-xamarin/profiles/mono-mac-xamarin-no-pcl/build-root/mono-3.2.0/mcs/class/System/System.Net.Sockets/Socket.cs:1115 
    at RFID.MainClass.Main (System.String[] args) [0x0002b] in /Users/jab/Projects/RFID/RFID/Program.cs:17 

.........

Теперь я знаю, что это очень примитивный вопрос, но мне нужно указать в правильном направлении :)

TIA.

+0

Вы смешиваете как клиент, так и сервер. Bind используется на стороне сервера, а Connect используется на стороне клиента. –

+1

. Я предлагаю вам использовать msdn [Socket Examples] (http://msdn.microsoft.com/en-us/library/w89fhyex.aspx). Сначала изучите синхронный, затем перейдите к асинхронному. –

+0

Thx all ... Я попробую :) – user1086115

ответ

0

Проблема возникает, потому что вы connect гнездо. Но вы будете подключать только клиент (а не сервер). Чтобы получить локальную конечную точку для прослушивания, просто создайте ее самостоятельно:

IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); 
IPAddress ipAddress = ipHostInfo.AddressList[0]; 
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 6009); 
s.Bind (localEndPoint); 

После этого он должен работать.

0

Причина, по которой bind() не будет работать для клиента, заключается в том, что connect() неявно связывает клиентский сокет с временным номером порта. Но, если вы попытаетесь связать() перед connect(), это будет успешным. Таким образом, для клиентской стороны все, что вам нужно сделать, это открыть сокет и подключиться. Для серверной стороны вам нужно будет открыть сокет, связать его с портом, начать прослушивание, а затем получать ожидающие подключения с помощью accept().

Смежные вопросы