110,533
社区成员
发帖
与我相关
我的任务
分享
Socket sokClient = sokConnectionparn as Socket;
while (true)
{
// 定义一个1M的缓存区;
byte[] arrMsgRec = new byte[1024];
// 将接受到的数据存入到输入 arrMsgRec中;
int length =0;
try
{
length = sokClient.Receive(arrMsgRec, 0, 1024, SocketFlags.None);// 接收数据,并返回数据的长度;
if (length > 0)
{
string strMsg = System.Text.Encoding.ASCII.GetString(arrMsgRec).TrimEnd('\0');// 将接受到的字节数据转化成字符串;
//给客户端回值
string ip=sokClient.RemoteEndPoint.ToString();
dict[ip].Send(“OOKK”);
}
}
}
listenSocket.BeginAccept(ar =>
{
var client = listenSocket.EndAccept(ar);
client.Send(Encoding.UTF8.GetBytes("Hello world"));
}, null);
ThreadPool.SetMinThreads(200, 50);
// 监听的代码
Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint serverInfo = new IPEndPoint(IPAddress.Parse("0.0.0.0"), MyConfigHelper.ListenPort);
listenSocket.Bind(serverInfo); //将SOCKET接口和IP端口绑定
listenSocket.Listen(MyConfigHelper.SocketAcceptNum); //开始监听,并且指定队列中最多可容纳的等待接受的传入连接数
LogHelper.WriteCustom("listening on port " + MyConfigHelper.ListenPort, "socketStart\\", false);
while (true)
{
try
{
Socket socket = listenSocket.Accept(); // 接受一个客户端
// IsBackground是避免exe退出,线程不会自动终止
// new Thread(RecieveAccept) { IsBackground = true }.Start(socket);
// 不能用线程池,因为默认线程池个数最小值是处理器数(24),导致线程很快被消耗一空,
// 新Socket连接无法在2秒内进入方法处理并返回,导致客户端超时
// 也可以使用 ThreadPool.SetMinThreads 来把初始值调大
ThreadPool.UnsafeQueueUserWorkItem(RecieveAccept, socket);
}
catch (Exception ex)
{
LogHelper.WriteException("err listening: ", ex);
}
}