При использовании API. NET Socket
важно помнить, что этот API является , а не нативным для. NET. Это оболочка для Windows Winsock 2 API, которая сама является Windows реализацией оригинального API сокетов Беркли . Это означает, что на базовом уровне сети могут быть доступны функции, которые необязательно предоставляются API. NET.
Кроме того, важно помнить, что класс Socket
предлагает несколько способов Совершено sh то же самое. В частности, метод Socket.Connect()
- не единственный механизм, который можно использовать для создания соединения. Существует также метод Socket.ConnectAsync()
, который использует SocketAsyncEventArgs
для предоставления состояния для операций сокета, включая запрос на соединение, и эта структура данных действительно предоставляет средства для клиента запрашивая соединение также предоставить буфер данных для отправки.
Даже без этого метода Socket
удаленная конечная точка может не использовать API. NET для выполнения запроса соединения. Другие API сокетов, такие как функция WSAConnect()
в Winsock 2, предоставляют клиенту механизм включения буфера данных для передачи вместе с запросом соединения.
Я сомневаюсь, что вы когда-нибудь найдете эти данные в сценарии, описанном в другом ответе. Т.е. если клиент делает запрос на соединение отдельно от какой-либо фактической операции отправки, впоследствии отправленные данные не будут включены в запрос на соединение. Это связано с тем, что клиент не может отправлять данные в сокет до тех пор, пока не будет завершен запрос на подключение, чего он не может, пока сервер не вызовет EndAccept()
. Любые данные, которые доставляются вместе с EndAccept()
, должны быть предоставлены как неотъемлемая часть исходного запроса на подключение.
Вы правы, что синхронный метод Socket.Connect()
не обеспечивает способ сделать это, но есть и другие доступные механизмы подключения, включая Socket.ConnectAsync()
, а также API-интерфейсы, отличные от. NET, которые позволяют включать буфер данных как часть запроса на подключение. Это те данные, которые будут получены сервером как часть вызова метода EndAccept()
.