private void targett()
{
MyServer=new IPEndPoint(myIP,8545);
sock =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
sock.Bind(MyServer);
            
while(true)
{
sock.Listen(50);
    listenshow.Text="主机"+myIP+"端口:8545开始监听......\r\n";
temp = sock.Accept(); 
if(temp.Connected == true)
{
listenshow.Text = "与客户建立连接。";
   

while(bb)
{
Byte[]  bbb=new Byte[64];
temp.Receive(bbb,bbb.Length,0);

string ccc=System.Text.Encoding.BigEndianUnicode.GetString(bbb);

showimage.AppendText(ccc+"\r\n");                  
} }
else
{
temp.Close();
listenshow.Text = "客户端开连接!";
}
}

}为什么在对方断开连接后.
执行不到
else{} 程序...

解决方案 »

  1.   

    else
    {
    temp.Close();
    listenshow.Text = "客户端开连接!";
    }
    中想做的是temp.Close(),重新等待连接...
      

  2.   

    断点调试 在:temp.Receive(bbb,bbb.Length,0);
    这一步..对方断开连接后,就不执行下面的else了.....
      

  3.   

    试试捕捉异常,如果远程主机强制关闭,在Receive可能会引发异常如果当前使用的是面向连接的 Socket,则 Receive 方法将读取所有可用的数据,直到达到 size 参数所指定的字节数为止。如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且所有可用数据均已收到,则 Receive 方法将立即完成并返回零字节。
      

  4.   

    如果没有可读取的数据,则 Receive 方法将一直阻止,直到数据可用为止,除非使用 Socket.ReceiveTimeout 设置了超时值。如果超过超时值,则 Receive 调用将引发 T:System.Net.Sockets.SocketException。
      

  5.   

    未处理的“System.Net.Sockets.SocketException”类型的异常出现在 system.dll 中。其他信息: 远程主机强迫关闭了一个现有的连接。temp.Receive(bbb,bbb.Length,0) ;    处...那如何处理此异常,让它继续下面的执行呢??
      

  6.   


      int byteRecv = 0;
      try
      {
            byteRecv = temp.Receive(.....
            if(byteRecv < 1)
            {
                //说名socket已经正常退出了
                temp.Close();
            }
      }
      catch(SocketException ex)
      {
          client socket被强制关闭
         
       }
      catch(ObjectDisposedException ex)
      {
         server端socket 已经关闭
      }
      

  7.   

    再给你写具体点int byteRecv = 0;
      try
      {
            byteRecv = temp.Receive(.....
            if(byteRecv < 1)
            {
                //说名socket已经正常退出了
                temp.Close();
            }
      }
      catch(SocketException ex)
      {
          client socket被强制关闭
          temp.CLose()就可以
         
       }
      catch(ObjectDisposedException ex)
      {
         server端socket 已经关闭
         这里要处理所有的client socket的关闭。
         程序可以return 了
      }
      

  8.   

    试试先..
    谢谢,,Moon1(静静的黎明) ( ) 的解释
      

  9.   

    Moon1(静静的黎明)老兄再麻烦下..
    那在哪个里面设置 temp从新等待  新的连接呢??
      

  10.   

    while(true)
    {

    sock.Listen(50);
    listenshow.Text="主机"+myIP+"端口:8545开始监听......\r\n";
    temp = sock.Accept(); 
    if(temp.Connected == true)
    {
    listenshow.Text = "与客户建立连接。";
       

    while(bb)
    {
    int byteRecv = 0;
    try
    {
    Byte[]  bbb=new Byte[64];
    byteRecv = temp.Receive(bbb,bbb.Length,0);
    if(byteRecv < 1)
    {
    temp.Close();
    listenshow.Text = "与客户断开连接。";
    }
    string ccc=System.Text.Encoding.BigEndianUnicode.GetString(bbb);

    showimage.AppendText(ccc+"\r\n");   
    } catch(SocketException ex)
    {
        MessageBox.Show(ex.ToString());
    temp.Close();
                                        listenshow.Text = "与客户断开连接。";
    } catch(ObjectDisposedException ex)
                                    {
                                        MessageBox.Show(ex.ToString());
                                        return ;
                                    } } }
    } }
    已经可以判断,用户端的断开了...
      

  11.   

    浪客兄弟,temp 是代表客户的socket你是想让server端的socket继续接受下一个连接过来的客户吧你的代码逻辑基本是可以的。但sock.Listen()必须放在while的前面  Listen一次就可以。
    sock.Listen(5);
    while(true)
    {
         Socket temp = sock.Accept();
        //你这里的含义不就是不间断的处理客户连接么。呵呵
    }
      

  12.   

    静静的黎明,老兄 这个不能在用户端断开连接后,再次连接成功...
    sock.Listen(50);
    listenshow.Text="主机"+myIP+"端口:8545开始监听......\r\n";
    while(true)
    {
    temp = sock.Accept(); 
    if(temp.Connected == true)
    {
    listenshow.Text = "与客户建立连接。";
    while(bb)
    {
    int byteRecv = 0;
    try
    {
    Byte[]  bbb=new Byte[64];
    byteRecv = temp.Receive(bbb,bbb.Length,0);
    if(byteRecv < 1)
    {
    temp.Close();
    listenshow.Text = "与客户断开连接。";
    }
    string ccc=System.Text.Encoding.BigEndianUnicode.GetString(bbb);

    showimage.AppendText(ccc+"\r\n");   
    } catch(SocketException ex)
    {
        MessageBox.Show(ex.ToString());
    temp.Close();
                                        listenshow.Text = "与客户断开连接。";
    } catch(ObjectDisposedException ex)
                                    {
                                        MessageBox.Show(ex.ToString());
                                        return ;
                                    } }
    }
    }
      

  13.   

    各位在处理这样的问题:(用户断开后二次连接,此时服务器断还是原来那socket)时是怎么处理的 ???或者有没有其他的方法,或者实现思路.....谢谢了
      

  14.   

    代码逻辑有点乱。=====================
    if(byteRecv < 1) { temp.Close(); listenshow.Text = "与客户断开连接。";
                     break;// 这里加个break;!!!!
            }SocketException{ 里面也加break;} 因为之前不知道你整体是靠while工作的
      

  15.   

    呵呵…………
    还没见过楼主这样写代码的。一般来说Socket客户端断开有三种情况:
    1、客户端正常断开,如:客户端调用Close()成员函数。这时服务端的Receive()会返回一个零长度的封包。你可以以此判断客户端已经断开。
    2、客户端异常断开,如:客户端异常崩溃。这时服务端Socket会引发一个Socket异常,你可以捕捉这个异常来判断客户端已经断开。
    2、基础网络异常断开,如:网线被切断。这种情况服务端不会有任何变化。你需要用另外的机制来判断。PS:建议你重新编写你这段代码。逻辑很乱!
      

  16.   

    Moon1(静静的黎明) 老兄,功能能够实现了..非常感谢..wzd24(牧野)(衣带渐宽终不悔,为伊消得人憔悴) 老兄谢谢你的建议..打算在此基础上按照你的思路从新写这部分的代码..hjiaming(无边无际无求) 老兄,谢谢你对消息发送接受的解释,让我清晰了不少...谢谢各位!!!!!
      

  17.   

    值得注意的是:对方断开连接以后就会产生一个异常所以程序还是执行不到else,
    try
    {}
    catch
    {
       //显示断开连接
       //close连接
    }
      

  18.   

    请问:while(bb) 这里的BB是什么?