Нужна помощь в записи в сокет после получения отключения на стороне чтения
Я пытаюсь реализовать HTTP-прокси в C# как часть общего бизнес-приложения, над которым я работаю, и столкнулся со следующей загадкой.
Часть стандарта HTTP указывает, что браузер может выполнить отключение сокета (SocketShutdown.Send), после чего сервер доставит все оставшиеся данные в браузер и закроет свою половину сокета. Я получаю ожидаемое поведение на принимающей стороне сокета, когда браузер наполовину закрывает свое соединение, а именно Select() указывает, что сокет доступен для чтения, но чтение из сокета с использованием Receive() возвращает ноль байтов. Но когда я пытаюсь выполнить запись в мою сторону сокета с помощью Send(), я получаю исключение SocketException, указывающее WSAECONNRESET. Это как если бы Shutdown() браузером вызывал разрыв всего TCP-соединения, а не только входящего участка.
У кого-нибудь есть опыт использования полузакрытых сокетов в C# и, в частности, записи в сокет, который был полузакрыт вашим коллегой?
Пока нет примера кода, но я предоставлю его, если нет никого, кто мог бы ответить.
1 ответ
Вы не можете сказать, был ли входящий FIN вызван выключением или закрытием. В данном случае это было явно вызвано закрытием. Правильный метод, когда вы получаете FIN для входящего сокета A, это отключение соответствующего исходящего сокета B для записи, затем, когда вы получаете FIN для этого сокета как входящий сокет (B), отключите соответствующий исходящий сокет A для записи. Когда вы отключите обе розетки, закройте их обе.