Пользовательский прослушиватель Http в С#

86
9

У.NET есть встроенный класс HttpListener, однако мне было интересно, как я мог бы свернуть собственный Http-прослушиватель. Я знаю, что есть много последствий для этого, но я просто хочу, чтобы браузер и мое собственное приложение взаимодействовали друг с другом.

Это код, который я написал до сих пор:

Socket servSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
servSocket.ExclusiveAddressUse = false; // Does this matter?
servSocket.Bind(new IPEndPoint(IPAddress.Any, 8080));
servSocket.Listen(10);

byte[] buffer;

do
{
try
{
Socket clientSocket = servSocket.Accept();

Console.WriteLine("Received Request at: {0}.", DateTime.Now);

EndPoint remoteEP = clientSocket.RemoteEndPoint;
buffer = new byte[1024];
clientSocket.ReceiveFrom(buffer, SocketFlags.None, ref remoteEP);
string request = Encoding.UTF8.GetString(buffer);
System.Diagnostics.Trace.Write(request);
buffer = Encoding.UTF8.GetBytes("<html><head><link rel=\"icon\" href=\"data:;base64,=\"></head><body></body></html>");
clientSocket.Send(buffer);

clientSocket.Close();
clientSocket.Dispose();
}
catch { }
}
while (this.isRunning);

Подобные работы, однако, я заметил, что локальная конечная точка clientSocket находится на том же порту, что и servSocket. С помощью встроенного HttpListener запрос обрабатывается случайным локальным конечным портом. Как я могу имитировать это?

Я установил флаг ExclusiveAddressUse в false, однако я все еще не могу связать более одного сокета с этой конкретной конечной точкой, так что же его точное использование?

Кроме того, время от времени я получаю SocketException с "Установленное соединение было прервано программным обеспечением вашей хост-машины". Что может быть источником проблемы?

спросил(а) 2014-04-08T17:19:00+04:00 6 лет, 2 месяца назад
1
Решение
85

Простой ответ: "На самом деле это вас не волнует".

TCP работает, устанавливая двухстороннее "виртуальное" постоянное соединение. Для достижения этой иллюзии он использует отдельный порт для связи с данным клиентом. Вы все еще подключаетесь к порту 80 (например), но тысяча клиентов использует тысячу различных портов для фактической связи с сервером.

ExclusiveAddressUse позволяет связывать больше сокетов с одним и тем же портом, но каждый из них должен иметь свой собственный IP-адрес.

Сетевое взаимодействие сложно. У нас такая высокая абстракция, как вы можете, будь то TcpListener, HttpListener или даже OWIN.

ответил(а) 2014-04-09T12:39:00+04:00 6 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема