backlog: server端等待连接的队列长度
示例代码
Server
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace server
{
class Program
{
static void Main(string[] args)
{
var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Bind(new IPEndPoint(IPAddress.Any, 8060));
sock.Listen(10);
var sockList = new List<Socket>();
int i = 0;
while (true)
{
Console.WriteLine("wait accept: "+i);
var clientsock = sock.Accept();
Console.WriteLine("accept " + i++);
Thread.Sleep(1000);
sockList.Add(clientsock);
}
}
}
}
client
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace client
{
class Program
{
static void Main(string[] args)
{
var sockList = new List<Socket>();
int i = 0;
while (i<20)
{
Task.Factory.StartNew(index =>
{
try
{
Console.WriteLine($"client {index} begin!");
var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8060));
Console.WriteLine($"client {index} connected!");
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}, i++);
}
while (true)
{
Console.WriteLine("input any key");
var v = Console.ReadLine();
Console.WriteLine(v);
}
Console.Read();
}
}
}
测试结果
多个client连接出现异常。
延时去掉后,恢复正常。
总结
- 不要阻塞Server端的accept操作,否则并发量高的情况下client会连接失败;
- backlog值不应太小,同样会影响并发,若并发峰值高于backlog,即会引起client端异常。