gpt4 book ai didi

c# - 为什么在服务器应用程序中需要两个套接字?

转载 作者:行者123 更新时间:2023-12-03 12:03:17 24 4
gpt4 key购买 nike

我正在尝试学习C#中的套接字编程
通过使用Google,我发现了很多很好的教程和示例。
但是这是我自己的代码:

发件人应用程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net; // socket library
using System.Net.Sockets; // socket library

namespace Sender
{
class Program
{
static void Main(string[] args)
{
Console.Write("Enter remote IP : ");
IPAddress ipAddress = IPAddress.Parse(Console.ReadLine());
Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sender.Connect(ipAddress, 4444);
Console.Write("Enter text to send : ");
byte[] message = Encoding.ASCII.GetBytes(Console.ReadLine().ToString());
sender.Send(message);
sender.Shutdown(SocketShutdown.Both);
sender.Close();
Console.ReadKey();
} // main
} // main
} // main

接收者应用程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net; // socket library
using System.Net.Sockets; // socket library

namespace Listener
{
class Program
{
static void Main(string[] args)
{
IPAddress ipAddress = Dns.GetHostAddresses(Dns.GetHostName()).Where(address => address.AddressFamily == AddressFamily.InterNetwork).First();
Console.WriteLine("Listening on " + ipAddress.ToString() + " : 4444");
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 4444);
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(localEndPoint);
listener.Listen(10);
Socket handler = listener.Accept();
byte[] bytes = new Byte[1024];
int bytesRec = handler.Receive(bytes);
Console.WriteLine(Encoding.ASCII.GetString(bytes, 0, bytesRec));
handler.Shutdown(SocketShutdown.Both);
handler.Close();
listener.Close();
Console.ReadKey();
} // main
} // main
} // main

该代码工作正常,但我想知道为什么在服务器端需要两个套接字?第一个是监听器,第二个是处理程序。是否可以忽略其中之一,使代码变得更简单?

顺便说一句,我的代码是基于以下代码:

同步客户端套接字示例: https://docs.microsoft.com/en-us/dotnet/framework/network-programming/synchronous-client-socket-example

同步服务器套接字示例: https://docs.microsoft.com/en-us/dotnet/framework/network-programming/synchronous-server-socket-example

另外,我正在使用Microsoft Visual C#2008 Express Edition

最佳答案

监听器套接字正在监听传入的连接。如果没有处理程序套接字,那么在与客户端的通信结束之前,没有人可以监听并行的传入连接。

这就是Accept返回另一个用于通信的套接字的原因,而监听套接字继续等待传入的连接。

您可以将其视为一种弱类型的对象:套接字负责监听和通信角色,尽管为这两个不同的任务使用不同的类型可能会更好。但是,此行为反射(reflect)了traditional socket行为,因此它保持原样,以便对具有网络编程背景的人们熟悉。

更高级别的API(TcpListenerTcpClient)在监听和通信角色之间有明显的区别。

关于c# - 为什么在服务器应用程序中需要两个套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54655793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com