Windows 8 および VS2012 に固有の問題が発生しています。
TCP ソケット サーバーとクライアントがあり、ローカル ネットワークでいくつかのテストを行っています。sysinternals TCPView を使用すると、パケットが TCP クライアントから送信され、TCP サーバーに到着することがわかります (パケット カウンターが増加していることがわかります)。
しかし、データがアプリケーション スタックに到達していないように見えますか? Windows 7 では、まったく同じビルドが問題なく実行されます。
Windows 8 ファイアウォールをオフにして、UAC をオフにしたドメイン管理者ユーザーに対して昇格された権限で両方のプロセスを実行します。
クライアントを外部サーバー (別のマシンで実行中) に接続すると、すべて正常に動作します。Windows 8 には、ローカル プロセス間の TCP データ通信を禁止できるものは他にありますか?
ありがとう、
編集
サーバー アプリケーションでこの問題が発生していないことを確認するために、ソケット コンストラクターに次のコードを使用して、コンソール アプリケーションにクイック TCP サーバーを作成しました。
listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
サーバーアプリケーションと同じローカルIP /ポートでリッスンします。同じ問題が発生しています。ポートに telnet で接続できますが、listenerSocket.AcceptAsync はヒットしません。
編集2
さらにテストすると、問題が非同期ソケット呼び出しの使用に関係していることがわかりました。つまり、socket.Accept() のような同期呼び出しを使用すると、テスト アプリケーションは正常に実行されます。ただし、非同期ソケット呼び出し、つまり socket.AcceptAsync() を使用すると、前述の問題が発生します。これまでのところ、非同期ソケット呼び出しに関する win7 と 8 の違いについての言及は見つかりませんでした。
これは、非同期コールバックがトリガーされないことを示す簡単なサンプル アプリです。このスニペットは Windows 7 では問題なく動作しますが、Windows 8 では動作しません (127.0.0.1 : 7000 に telnet で接続してみてください)。
class Program
{
private static SocketAsyncEventArgs socketAsyncEventArgs = new SocketAsyncEventArgs();
static void Main(string[] args)
{
var listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listenerSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7000));
listenerSocket.Listen(100);
socketAsyncEventArgs.Completed += AcceptEventArg_Completed;
listenerSocket.AcceptAsync(socketAsyncEventArgs);
Console.ReadLine();
}
private static void AcceptEventArg_Completed(object sender, SocketAsyncEventArgs e)
{
Console.WriteLine("AcceptEventArg_Completed");
}
}
編集3
Microsoft Connect で同じ問題を報告している他の 2 人を見つけました: https://connect.microsoft.com/VisualStudio/feedback/details/759913/socketasynceventargs-completed-doesnt-fire-in-net-framework-4-5 および http: //connect.microsoft.com/VisualStudio/feedback/details/747218/saea-not-working-in-net-4-5-rp
2 つ目は、Console.ReadLine() 呼び出しに Windows のバグがあり、それが問題を引き起こし、非同期コールバックをブロックしていると結論付けているように見えるため、興味深いものです。スニペットの Console.ReadLine() を次のように置き換えると:
while (true)
{
System.Threading.Thread.Sleep(10);
}
すべて正常に動作します。