读书人

异步 Socket how to ?解决方法

发布时间: 2012-04-14 17:14:21 作者: rapoo

异步 Socket how to ?

C# code
public class Server{  publoc Server()  {    Socket Accepter=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);    IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());    IPAddress ipAddress = ipHostInfo.AddressList[0];    Accepter.Bind(new IPEndPoint(ipAddress, 7070));    GetNewClient += new AsyncCallback(PkManager_GetNewClient);    //然后调用    ccepter.Listen(1000);    Accepter.BeginAccept(GetNewClient, Accepter);  }          void PkManager_GetNewClient(IAsyncResult ar)        {            //Accepter.EndAccept(            Add(new T() { });            Accepter.BeginAccept(GetNewClient, null);            //autoEvent.Set();        }}


问题1:以Begin开头的方法是不是这样?
beginMethod(回调,state);

回调(state)
{
endMethod
//然后再调用
beginMethod(回调,state)
}

从而形成循环?

问题2:
Socket的EndAccept方法 返回一个 新的 Socket对象那么 如果我要做上千人,上万人的服务器 岂不是也要产生成千上万的Socket对象?

问题3:有了异步方法(不使用线程)是不是就能够实现循环?
就是反复循环的递归 调用beginMethod 和EndMethod就是实现了循环而且主
进程也不会出现阻塞 是这样吗?


整个服务器使用一个Client类的对象 集合来维系


[解决办法]
1.BeginAccept和EndAccept是配对用的。
2。对,每个用户维护一个socket连接
3。同步也能实现循环,只不过效率低。

第一条用来 接受新连接
第二条用来 处理逻辑
第三条用来 发送
第四条用来 接受

看来你弄混了。 看看接受的情况(发送同里)。假设已有了两个socket连接。
void OnConnectRequest(...)
{
.....
mySocket.BeginReceive(this.Buffer, 0, BufferSize, SocketFlags.None, GetrecieveData, null);
.....
}

void GetrecieveData(IAsyncResult ar)
{
//数据处理。 这并不意味着你用同一个线程进行mySocket1,mySocket2的数据处理。这只是个函数,每个调用系统都会分配独立的栈的,对于所有的socket的回调来说都是独立的(不靠率lock的情况)
}

读书人网 >C#

热点推荐