科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道[冷枫]socket异步处理问题

[冷枫]socket异步处理问题

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

socket异步处理问题,解决端口占用.

作者:冷枫 来源:CSDN 2007年9月21日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

在Listen方法中使用异步访问:
void Listen()
        
{
            
int nPort = 8000;            
            IPEndPoint ipLocalEndPoint;
            
try
            
{
//                IPAddress ipAddress = Dns.Resolve("localhost").AddressList[0];
                ipLocalEndPoint = new IPEndPoint(GetServerIP(), nPort); 
            }

            
catch(SocketException socErr )
            
{
                MessageBox.Show(socErr.Message);
                
return;
            }

           
            
try
            
{                
                ListenSoc 
= new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp );
                ListenSoc.Bind(ipLocalEndPoint);
                ListenSoc.Listen(
100);
                
while (true)
                
{
                    allDone.Reset();
                    ListenSoc.Soc.BeginAccept(
new AsyncCallback(AcceptCallback),ListenSoc); //异步访问,并定义回调方法
                    allDone.WaitOne();

                }

            }

            
catch(Exception err) 
            
{
                MessageBox.Show(err.Message);
            }

        }

实现回调方法:
public void AcceptCallback(IAsyncResult ar) 
        
{
            
try
            
{
                allDone.Set();
                WSocket listener 
= (WSocket) ar.AsyncState;
                
int nSoc = GetAvailbleSocket(); //获取有效的Socket,即一个新的Socket实例
SocClient[nSoc] = (Socket)ListenSoc.EndAccept(ar);
//在这里处理接收过来得数据
}

}

private int GetAvailbleSocket()
        
{
            
int i=-1;
            
for( i=0;i<MAX_SOCKET;i++)
            
{
                
try
                
{
                    
if (SocClient[i]==null)
                        
break;
                    
else
                    
{
                        
if (!SocClient[i].Soc.Connected)
                            
break;
                    }

                }

                
catch (Exception err) 
                
{
                    MessageBox.Show(
"GetSock :"+err.Message);
                }


            }


            
if ((i>-1)&& (i <MAX_SOCKET))  
                InitSocket(
ref SocClient[i],i);
            
return i;
        }
 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1793977

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章