0

だから、私はこの「ソケット」プログラミングにまったく慣れていないので、根本的に誤解しているものがあるようです...

私が使用しているサーバーのドキュメントは非常に貧弱に書かれていますが、「イベントベース」の「ストリーミングソケット接続」を使用していると書かれています...サーバーはローカルネットワーク上にあります。

これが私の最初の単純なプログラムフローです(非同期などはありません!):

.........

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 

.........

これが非常に原始的な質問であることはわかっていますが、正しい方向に向ける必要があります:)

ティア。

4

2 に答える 2

0

bind() がクライアントに対して機能しない理由は、connect() が暗黙的にクライアント ソケットを一時的なポート番号にバインドするためです。ただし、connect() の前に bind() を試行すると、成功します。したがって、クライアント側では、ソケットを開いて接続するだけです。サーバー側では、ソケットを開き、それをポートにバインドし、リッスンを開始してから、accept() を使用して保留中の接続を取得する必要があります。

于 2013-08-21T19:23:21.507 に答える