socket异步连接后,关闭服务端后,客户端再发送信息出现错误

下面的代码是从网找到的,能正常运行没有问题,我有一些问题: 
1 、TcpListener server 这些变量都是局部的,为什么还能正常工作。 
2 、我如何停止监听服务。 

private   void  AcceptCallback(IAsyncResult ar)  
        
{  
            TcpListener server 
= (TcpListener)ar.AsyncState;  
            ClientState state 
= new ClientState();  

            
// Once the accept operation completes, this callback will  
            
// be called. In it, you can create a new TcpClient in much  
            
// the same way you did it in the synchronous code you had:  

            state.client 
= server.EndAcceptTcpClient(ar);  

            
// We 're going to start reading from the client 's stream, and  
            
// we need a buffer for that:  

            state.buffer 
= new byte[4096];  

            
// Note that the TcpClient and the byte[] are both put into  
            
// this "ClientState" object. We 're going to need an easy  
            
// way to get at those values in the callback for the read  
            
// operation.  

            
// Next, start a new accept operation so that we can process  
            
// another client connection:  

            server.BeginAcceptTcpClient(AcceptCallback, server);  

            
// Finally, start a read operation on the client we just  
            
// accepted. Note that you could do this before starting the  
            
// accept operation; the order isn 't really important.  

            state.client.GetStream().BeginRead(state.buffer, 
0,state.buffer.Length, ReadCallback, state);  
        }
  

        
private   void  ReadCallback(IAsyncResult ar)  
        
{  
            ClientState state 
= (ClientState)ar.AsyncState;  
            
int cbRead = state.client.GetStream().EndRead(ar);  

            
if (cbRead == 0)  
            
{  
                
// The client has closed the connection  
                return;  
            }
 
            
// Your data is in state.buffer, and there are cbRead  
            
// bytes to process in the buffer. This number may be  
            
// anywhere from 1 up to the length of the buffer.  
            
// The i/o completes when there is _any_ data to be read,  
            
// not necessarily when the buffer is full.  

            
// So, for example: 下面的是我的实现。 
            SockMsgStruct message = new SockMsgStruct(); 
            message 
= (SockMsgStruct)ZhiKe.Serialization.ByteToObj(state.buffer); 

            StreamWriter f 
= new StreamWriter("c:/aa.txt",true); 
            f.WriteLine(message.MsgUid); 
            f.WriteLine(message.sMsg); 
            f.WriteLine(message.iMsgType); 
            f.Flush(); 
            f.Close(); 
            
//textBox1.Text = textBox1.Text + strData + "/n/r"; 

            
// For ASCII you won 't have to worry about partial characters  
            
// but for pretty much any other common encoding you 'll have to  
            
// deal with that possibility, as there 's no guarantee that an  
            
// entire character will be transmitted in one piece.  

            
// Of course, even with ASCII, you need to watch your string  
            
// terminations. You 'll have to either check the read buffer  
            
// directly for a null terminator, or have some other means  
            
// of detecting the actual end of a string. By the time the  
            
// string goes through the decoding process, you 'll have lost  
            
// that information.  

            
// As with the accept operation, we need to start a new read  
            
// operation on this client, so that we can process the next  
            
// bit of data that 's sent:  

            state.client.GetStream().BeginRead(state.buffer, 
0,state.buffer.Length, ReadCallback, state); 
        }
  

        
private   void  button1_Click( object  sender, EventArgs e) 
        

            Int32 port 
= int.Parse(txtPort.Text); 
            IPAddress localAddr 
= IPAddress.Parse(cmbAddress.Text); 
            TcpListener server 
= new TcpListener(localAddr, port); 
            server.Start(); 
            
// The above is pretty much what you had, cleaned up  
            
// a bit. All you have to do at this point is start  
            
// an accept operation:  
            server.BeginAcceptTcpClient(AcceptCallback, server);  
        }
 


  
class  ClientState 
    

        
public TcpClient client; 
        
public byte[] buffer; 
    }
 

 我用下面的方法修改后,我用server .close()关闭后,我用客户端连接后出现错误如下面的图

TcpListener server =null;
private void button1_Click(object sender, EventArgs e) 
        { 
            Int32 port = int.Parse(txtPort.Text); 
            IPAddress localAddr = IPAddress.Parse(cmbAddress.Text); 
            server = new TcpListener(localAddr, port); 
         ...
        }
最后需要关闭的时候,使用server .close()就行了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunnf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值