2013-08-21 145 views
0

所以我所有的新绑定到这个“插座”的编程和似乎有东西,我从根本上误解了......无法连接的插座

为我用写很差服务器的文档,但表示它使用“流式套接字连接”,即“基于事件”...服务器位于本地网络上。

这里是我的第一天真的程序流程(没有异步或任何东西!):

.........

1)首先,我需要一个Socket ......没问题..我拿到:)

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

2)然后,我用它连接...也没问题:)

s.Connect("10.10.10.36", 6009); 

3)现在,我有m个Y接我有由服务器提供的新的本地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

你在混淆客户端和服务器。绑定用于服务器端,连接用于客户端 –

+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()之前尝试bind(),那么它会成功。所以,对于客户端来说,所有你需要做的就是打开一个套接字并连接。对于服务器端,您需要打开套接字,将其绑定到端口,开始监听,然后使用accept()获取挂起的连接。