Situation
Nous utilisons le code suivant pour accepter les requêtes HTTP entrantes.Combien de temps devrions-nous attendre pour vérifier les données disponibles après avoir accepté une connexion?
var localEndPoint = new IPEndPoint(IPAddress.Any, Port);
var serverSocket = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
serverSocket.Bind(localEndPoint);
serverSocket.Listen(backlog: 25);
while (true)
{
using (var clientSocket = serverSocket.Accept())
{
if (clientSocket.Available > 0)
{
var builder = new StringBuilder();
while (clientSocket.Available > 0)
{
var currentBytes = new byte[clientSocket.Available];
var bytesReceived = clientSocket.Receive(currentBytes);
var currentBytesString =
new string(Encoding.UTF8.GetChars(currentBytes));
builder.Append(currentBytesString);
}
}
}
}
Problème
Parfois clientSocket.Available
est égal à zéro, même si la connexion de données. La solution que nous avons implémentée consiste à attendre après avoir accepté la connexion avant de vérifier si les données sont disponibles. Nous le faisons comme ceci:
var start = DateTime.Now;
var duration = new TimeSpan(0);
while (clientSocket.Available <= 0 || duration.Milliseconds < 1000)
{
duration = DateTime.Now - start;
Thread.Sleep(100);
}
Question
Après avoir accepté une connexion, combien de temps nous devons nous attendre avant que les données de la connexion seront disponibles dans la prise?
Solution de travail
Merci à SZYM pour l'inspiration pour cette approche. Cela fonctionne pour le moment.
while (true)
{
using (var clientSocket = serverSocket.Accept())
{
var builder = new StringBuilder();
do
{
var currentBytes = new byte[50];
var bytesReceived = clientSocket.Receive(currentBytes);
var currentBytesString =
new string(Encoding.UTF8.GetChars(currentBytes));
builder.Append(currentBytesString);
}
while (clientSocket.Available > 0);
}
}
Pourquoi ne pas simplement appeler Read et le laisser bloquer jusqu'à ce que des données soient disponibles? –
Je ne sais pas. Qu'est-ce qui est disponible pour dans ce cas? –