lzmtw 大哥。。。
请教一个问题!!
Dim socke As Socket
Dim udppoint As New IPEndPoint(IPAddress.Parse(TextBox1.Text), 6112)
Dim data() As Byte = {69, 0, 0, 44, 20, 225, 0, 0, 128, 17, 112, 117, 10, 129, 80, 84, 10, 129, 80, 95, 23, 224, 23, 224, 0, 24, 123, 179, 247, 47, 16, 0, 80, 88, 51, 87, 20, 0, 0, 0, 0, 0, 0, 0}
socke = New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP)
socke.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1)
socke.SendTo(data, udpoint)
执行调试时,到了 socke.SendTo(data, udpoint) 就报错 “一个封锁操作被对 WSACancelblockingCall 的调用中断."
可以帮帮我看看问题出在哪里吗!!!!谢谢!!!
-
水如烟 回复于:2008-04-28
-
对socket我没直接用过,这方面的我只是初步接触了下remoting
有些东西是不能调试的,时间稍长就自我销毁.
你参考一下这篇:http://coffecoco.bokee.com/806282.html
监听线程的处理
监听线程会在下列语句处阻塞,直到有连接请求进入。
'接收连接请求
m_sckAccept = m_sckListen.AcceptTcpClient
在阻塞的状况下,简单的使用Abort,仅仅是将线程设置为AbortRequest状态,而没有真正的解除线程的阻塞,甚至使用Application.Exit(),也无法真正的终止线程并释放线程所占有的资源。这样在下次在同一个端口调用监听时就会有错误发生。并且在应用程序退出后,监听线程依然像孤魂野鬼一般在内存中阻塞着。
如果在此时直接调用m_sckListen.Stop来终止监听,则会发生以下描述信息的错误:
一个封锁操作被对 WSACancelBlockingCall 的调用中断。
但是这样似乎并不会影响以后对此端口监听的调用,并且能够结束线程。
彻底解决问题的一种方法是用一个终止标志作为监听循环的条件,需要终止监听时,先设置终止标志为退出监听循环,然后向自己的监听器发送一个连接请求解除监听线程的阻塞,然后就可以安全的退出监听循环,关闭监听,并结束监听线程。这样在程序结束以后也不会有线程滞留的现象。
多个连接请求
对于多个连接请求,TcpListener将他们放入一个队列,直到到达可接收的连接的最大数,通过Accept的调用用队列中删除已经接收的连接请求。另外由于采用了在传输时动态建立连接的结构,不需要长期维护多个连接有效,使等待处理的队列非常短,所以对于不是特别频繁的多个连接请求,本例子都可以轻松的处理。但是并没有进行非常严格的极限测试,所以不保证对于大量的、并发性较强的多个连接能够有效处理。