我发现可以使用EndAccept传输初始数据。
这是从docs:
EndAccept(Byte[], IAsyncResult)
Asynchronously accepts an incoming connection attempt and creates a new Socket object to handle remote host communication. This method returns a buffer that contains the initial data transferred. C#
我如何发送此初始字节? BeginConnect没有给我选择。我还有其他方法可以使用吗?
最佳答案
使用.NET Socket
API时,请记住该API不是.NET固有的,这一点很重要。它是Windows Winsock 2 API的包装,而Windows Winsock 2 API本身是原始Berkeley sockets API的Windows实现。这意味着,.NET API不一定会公开基础网络级别上可用的功能。
此外,请务必记住Socket
类提供了多种方法来完成同一件事。特别是,Socket.Connect()
方法不是唯一可用于创建连接的机制。还有Socket.ConnectAsync()
方法,它使用 SocketAsyncEventArgs
为套接字操作提供状态,包括连接请求,并且此数据结构的确为客户端请求连接提供了一种手段,还提供了要发送的数据缓冲区。
即使没有Socket
方法,远程端点也可能不会使用.NET的API发出连接请求。其他套接字API,例如Winsock 2中的 WSAConnect()
函数,为客户端提供了一种机制,以包括与传输请求一起传输的数据缓冲区。
我怀疑您是否会在其他答案描述的场景中找到该数据。 IE。如果客户端与任何实际发送操作分开发出连接请求,则后续发送的数据将不包含在连接请求中。这是因为在连接请求完成之前,客户端无法在套接字上发送数据,而在服务器调用EndAccept()
之前,客户端无法发送数据。必须将与EndAccept()
一起交付的任何数据作为原始连接请求的组成部分提供。
您是正确的,同步Socket.Connect()
方法没有提供执行此操作的方法,但是还有其他可用的连接机制,包括Socket.ConnectAsync()
以及非.NET套接字API,它们确实允许缓冲数据。包含在连接请求中。这些数据将作为EndAccept()
方法调用的一部分由服务器接收。
关于c# - 如何使用初始字节连接到套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61294281/