C# 如何使用初始字节连接到套接字

C# 如何使用初始字节连接到套接字,c#,sockets,asynchronous,networking,C#,Sockets,Asynchronous,Networking,我发现使用EndAccept可以获得传输的初始数据 这是来自: EndAccept(字节[],IAsyncResult) 异步接受传入连接尝试并创建 处理远程主机通信的新套接字对象。这种方法 返回包含传输的初始数据的缓冲区。C# 如何发送此初始字节?BeginConnect没有给我选择权。还有其他方法可以使用吗?我相信如果使用两个重载之一调用,等待发送初始数据块,那么相应的重载将提供该数据块。如果调用该重载,则意味着在服务器端,在客户端发送一些数据之前,接受客户端的API调用不会完成。我想这在您

我发现使用EndAccept可以获得传输的初始数据

这是来自:

EndAccept(字节[],IAsyncResult)

异步接受传入连接尝试并创建 处理远程主机通信的新套接字对象。这种方法 返回包含传输的初始数据的缓冲区。C#

如何发送此初始字节?BeginConnect没有给我选择权。还有其他方法可以使用吗?

我相信如果使用两个重载之一调用,等待发送初始数据块,那么相应的重载将提供该数据块。如果调用该重载,则意味着在服务器端,在客户端发送一些数据之前,接受客户端的API调用不会完成。我想这在您的服务器代码中更有效,这样您就不会醒来,直到有一些有用的数据与您接受的客户机一起使用。这可以节省大型服务器中的上下文切换并提高效率

如果只调用的重载不要求等待初始数据,则相应的将不提供任何初始传输的数据

这一点在以下摘录中的(即功能)中很明显:

如果提供了接收缓冲区,则在接受连接并读取数据之前,重叠操作不会完成


因此,您的问题“如何发送初始字节?”的答案在技术上只是让客户端“发送”。

在使用.NET
Socket
API时,请务必记住此API不是.NET的本机API。它是围绕Windows Winsock 2 API的包装器,它本身就是原始API的Windows实现。这意味着在底层网络级别可能有一些功能不一定由.NET API公开

此外,重要的是要记住,
Socket
类提供了多种方法来完成相同的任务。特别是,
Socket.Connect()
方法不是创建连接的唯一机制。还有
Socket.ConnectAsync()
方法,该方法用于为套接字操作(包括连接请求)提供状态,该数据结构确实为请求连接的客户端提供了一种方法,使其也能提供要发送的数据缓冲区

即使没有
Socket
方法,远程端点也可能没有使用.NET的API来发出连接请求。其他套接字API(如Winsock 2中的函数)为客户端提供了一种机制,使其包含数据缓冲区,以便与连接请求一起传输

我怀疑你是否会在另一个答案所描述的场景中发现这些数据。即,如果客户端与任何实际发送操作分开发出连接请求,则随后发送的数据将不包括在连接请求中。这是因为在连接请求完成之前,客户端无法在套接字上发送数据,而在服务器调用
EndAccept()
之前,客户端无法发送数据。随
EndAccept()
一起交付的任何数据都必须作为原始连接请求的组成部分提供

您是正确的,synchronous
Socket.Connect()
方法没有提供这样做的方法,但是还有其他可用的连接机制,包括
Socket.ConnectAsync()
,以及非.NET套接字API,它们允许将数据缓冲区作为连接请求的一部分。这些数据将作为
EndAccept()
方法调用的一部分由服务器接收