Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在每个方法中初始化一个新的套接字是一件好事吗?_C#_.net_Sockets_Asyncsocket - Fatal编程技术网

C# 在每个方法中初始化一个新的套接字是一件好事吗?

C# 在每个方法中初始化一个新的套接字是一件好事吗?,c#,.net,sockets,asyncsocket,C#,.net,Sockets,Asyncsocket,因此,我试图解决C#NET中的sockets编程问题,但从我的所见所闻来看,还没有关于它的好文章/指南(即使是官方MSDN网站也有过时的代码)。我正试图遵循这个链接,但由于它已经过时,我不确定其中包含的代码是否被认为是良好的实践。 因此,这里有一个代码: public void StartListening() { Socket listener = new Socket( localEP.Address.AddressFamily, SocketType.Stream, Pro

因此,我试图解决C#NET中的sockets编程问题,但从我的所见所闻来看,还没有关于它的好文章/指南(即使是官方MSDN网站也有过时的代码)。我正试图遵循这个链接,但由于它已经过时,我不确定其中包含的代码是否被认为是良好的实践。 因此,这里有一个代码:

public void StartListening() {
    Socket listener = new Socket( localEP.Address.AddressFamily,
    SocketType.Stream, ProtocolType.Tcp );

    listener.BeginAccept(new AsyncCallback(acceptCallback), listener);
}
public void acceptCallback(IAsyncResult ar) {
    Socket listener = (Socket) ar.AsyncState;
    Socket handler = listener.EndAccept(ar);
}
然后是这个代码:

public void StartListening() {
    Socket listener = new Socket( localEP.Address.AddressFamily,
    SocketType.Stream, ProtocolType.Tcp );

    listener.BeginAccept(new AsyncCallback(acceptCallback), listener);
}
public void acceptCallback(IAsyncResult ar) {
    Socket listener = (Socket) ar.AsyncState;
    Socket handler = listener.EndAccept(ar);
}
为什么
acceptCallback
会初始化一个新套接字?为什么所有的方法都要初始化自己的套接字?像这样只有一个类范围的私有套接字不是更好吗

private Socket listener=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)?为什么它首先创建一个侦听器套接字,然后创建一个处理程序套接字?这有什么意义?另外,在
beginacept
方法中作为参数传递的侦听器会发生什么情况?从表面上看,它只是在一个黑洞中死去

最后,我非常感谢所有能帮助我理解socket编程的教程/文章链接

为什么acceptCallback初始化一个新套接字

这就是BSD派生的套接字API的工作方式(并反映TCP/IP网络堆栈的工作方式)

您创建第一个套接字,其唯一任务是等待传入连接:通过
侦听
(或变体)方法,然后通过
接受
方法(或变体)建立连接

它返回另一个
Socket
实例,该实例将用于与一个client1 Socket通信

初始侦听套接字继续可用于新的传入连接

这反映了具有多个客户端连接的服务器的模型

我们可以想象,
Socket
被两个函数重载:1。列出并接受连接,2。表示已建立的连接

堆栈溢出通常不做推荐(它们往往过时得太快):我是在80年代末Sun systems运行Sun OS时用C编写的,所以我无论如何也不能推荐任何东西:-)



1一旦建立了连接,客户端和服务器之间的操作在套接字级别上是对称的,但在考虑建立连接时,考虑服务器和客户端角色很有用。

请尝试以下网页上的示例代码:。这些示例使用套接字,但您可以使用继承套接字类的任何TCP类(如TCPListener、TCPClient)。我不喜欢初始化每个方法。这是不必要的,但如果不为每条邮件打开新连接,某些Microsoft库方法将无法正常工作。您发布的示例代码创建了一个状态对象,并将相同的状态对象传递给每个事件(回调),因此代码不会打开和关闭连接。STATE对象是一个已传递的参数。我确实在前面阅读了您提供的链接,我没有将其包含在我的帖子中,因为它只是我上面发布的链接的原始版本。您用一种令人困惑的方式表达了它(因为我谈论的是初始化套接字,而不是方法),但您是说每次发送消息时,我都需要为每条消息打开一个新的套接字吗?我是否理解正确,您所说的这个状态对象被转换为
IAsyncResult
,并作为参数传递给回调方法?在大多数情况下,您不需要为每个连接打开新套接字。您只需小心,某些库方法会自动关闭连接,而Microsoft使得在不使用实际关闭连接的方法的情况下,很难检测连接何时打开和关闭。IAsyncResults.AsyncState是状态对象。请参阅我之前发布的网站上的示例。因此,我需要一个用于侦听新客户机的套接字,以及用于接收和发送数据的每个客户机的附加套接字(每个客户机1个)?@Amai Yes。n个客户端的n+1个套接字。