2013-08-21 142 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()獲取掛起的連接。