我给你一个简单的例子,你可以参考一下。 using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Collections.Generic; using System.Text;namespace Listener { class clsWinSockListener { private Socket sckListen; private Socket[] sckAccept = new Socket[5]; private byte[] sndBuff; private byte[] revBuff; int useSck = 0; int port = 8080; public void Listen() {
是用时间Span来监听的吧.
我以前是用多线程做的,一个线程监听,一个线程弄托盘,一个线程处理数据.
不过这样很头疼,线程管理是个问题.你试试吧.
while(true){...}
实现的,这个方法执行不完,托盘的双击事件无法激活
{
....}
系统开销会增加。
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Collections.Generic;
using System.Text;namespace Listener
{
class clsWinSockListener
{
private Socket sckListen;
private Socket[] sckAccept = new Socket[5];
private byte[] sndBuff;
private byte[] revBuff;
int useSck = 0;
int port = 8080; public void Listen()
{
IPAddress[] addr = Dns.GetHostAddresses(Dns.GetHostName() );
IPEndPoint endpoint = new IPEndPoint(addr[0], 8080);
sckListen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sckListen.Bind(endpoint);
sckListen.Listen(10);
sckListen.BeginAccept(Listen_Callback, sckListen);
} private void Listen_Callback(IAsyncResult ar)
{
Socket s = (Socket)ar.AsyncState;
Socket s2 = s.EndAccept(ar);
if (ar.IsCompleted)
{
if (useSck >= 5)
{
string over = "403|";//假设服务端socket最大上限为5,超过5个就拒绝
sndBuff = Encoding.UTF8.GetBytes(over);
s2.Send(sndBuff);
s2.Disconnect(false);
s2.Close();
return;
}
port++;
string retus = "1000|" + port.ToString() ;
sckAccept[useSck] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress[] addr = Dns.GetHostAddresses(Dns.GetHostName());
IPEndPoint endpoint = new IPEndPoint(addr[0], port);
sckAccept[useSck].Bind(endpoint);
sckAccept[useSck].Listen(1);
sckAccept[useSck].BeginAccept(Commn_Callback, sckAccept[useSck]);
sndBuff = Encoding.UTF8.GetBytes(retus);
s2.Send(sndBuff);
Console.WriteLine("I am connected to " + IPAddress.Parse(((IPEndPoint)s2.RemoteEndPoint).Address.ToString()) + " on port number " + ((IPEndPoint)s2.RemoteEndPoint).Port.ToString());
s2.Disconnect(false);
s2.Close();
useSck++;
sckListen.BeginAccept(Listen_Callback, sckListen);
}
}
}
}
这是异步方式的例子,很简单,没有考虑过多细节,比如像C端断开后,server端socket计数等问题,你看看吧。
希望能有帮助。
这不是很底层的东西啊.
lz:假如是你的CUP占用比较高的话.我觉得应该是你的程序逻辑可能有点问题.
1个线程只需要处理接受和发送结果.
1个线程处理业务逻辑
...
这样的话应该没什么问题.问一下写Log了没有?你可以用Log监视啊
这几天忙另一个程序,还没来得及考虑CPU的利用率。
终于有时间考虑CPU的问题了。Log监视?不明白
[email protected]
当然可以,不过,现在还不完善,cpu利用率太高,等完成了,再发给你