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

标签 c# sockets asynchronous networking

我发现可以使用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/

相关文章:

c# - 从 Web 应用程序获取 DefaultAppPool AppData 文件夹

c# - Try/Catch 未在 ReportDocument.ExportToHttpResponse 中捕获 System.Threading.ThreadAbortException

c# - 从 C# 中的另一个线程修改类属性

python - pygame 中的窗口在等待时卡住

php - Windows 上 PHP 中的异步 popen exec

c# - 从父对象调用方法 C# Unity3d

c# - 组合表达式(表达式<Func<TIn,TOut>> 与表达式<Func<TOut, bool>>)

flash - Adobe 套接字策略文件服务器问题

javascript - Android 开发 - 在正常代码运行之前获取异步任务的结果

javascript - 在 if 语句中使用 child_process.exec 的返回值?