ReSocket.Connect(ip,port)】。我在一个线程中关闭ReSocket.Close()该套接字时出错。请问线程中能不能关闭主线程中创建的套接字?如果可以,该如何关闭?反之,线程中创建的套接字,在主程序中如何关闭?谢谢!!
19 个解决方案
#1
帮顶,等待高手解答
#2
我建议你用引用计数这样的技术。
#3
我建议你用引用计数这样的技术。????????能不能说明白一点?谢谢
#4
“请问线程中能不能关闭主线程中创建的套接字?”应该可以啊,返回什么错误?是不是你线程关闭Socket时主线程的Socket还没创建好?注意线程间数据的共享。
#5
关闭Socket时,Socket肯定创建好的。执行ReSocket.Close()时,程序崩溃掉。
#6
可能你在关闭Socket时,主线程正在对Socket做其它操作,你的Socket有没有加同步控制?
#7
顶ffffff
#8
可能是你线程close掉之后 别的地方可能有发送 或 接受的操作。
在发送或接受的地方 先判断 IsConnect() 的话 再操作。
在发送或接受的地方 先判断 IsConnect() 的话 再操作。
#9
其他地方没用到。我把线程改为函数形式就没问题。是不是主程序创建的Socket,线程不能用Close关闭释放Socket资源啊?貌似反过来也不行,即在线程中创建的Socket,主程序也不能用Close关闭释放Socket资源!
#10
发消息给主线程,让主线程自己关闭套接字
#11
我这些程序写在DLL中的。没窗体。怎么发消息。给个实例,谢谢?
#12
可以尝试在线程中 new CSocket,然后Attach父线程创建的CSocket的SOCKET
#13
我记得在VC6 下是不允许的,CSocket::Create函数,只允许拥有WindowProc的线程调用,因为调用这个函数,将会把OnAccept,OnConnect,OnRead,OnSend等消息处理,封装到消息循环中去处理,同样的
CSocket::Close将会把上述的消息循环取消.所以调用Create和Close函数,都必须是创建窗体的线程(一般都是主线程),否则会报异常
CSocket::Close将会把上述的消息循环取消.所以调用Create和Close函数,都必须是创建窗体的线程(一般都是主线程),否则会报异常
#14
你接受发送数据的线程跟Close的线程是不是同一个?如果不是,那就把他们挪到主线程里去,而原来执行Close的线程只要把调用Close的那句代码换成发送信号量给主线程,主线程收到信号量后就调用Close并退出。至于如何使用Windows的信号量,请看《Windows核心编程》。
#15
定义一个bool变量,在主线程里把这个值赋为false,当你子线程需要关闭主线程里的socket时,把这个值置为true,当主线程发现这个值为true时,关闭此socket即可。
#16
我想换思路解决这个问题,但碰到新的问题。我在线程中主要是为了一直连接服务端,不在函数中写这个连接是为了不影响主程序。所以我想在线程中新创建一个Socket进行连接服务端。当线程连接成功以后。在用主程序中的Socket进行连接服务端。但线程结束以后怎样告知主程序线程已经结束了呢?不要用一直判断的方式去判断线程是否结束,这样会影响主程序。最好发送消息命令的方式。当线程结束以后,发送一个命令通知主程序,线程已经结束。我的程序写在一个DLL中,但SendMessage好像针对的是窗体。请问DLL中如何进行消息传递??谢谢
#17
如果定义一个bool变量,那主程序就需要一直判断是否为true。影响主程序。这样就失去我写成线程的意义了。
#18
在dll中传入窗口句柄就可以使用SendMessage了
#19
CSocket不是线程安全的
#20
#1
帮顶,等待高手解答
#2
我建议你用引用计数这样的技术。
#3
我建议你用引用计数这样的技术。????????能不能说明白一点?谢谢
#4
“请问线程中能不能关闭主线程中创建的套接字?”应该可以啊,返回什么错误?是不是你线程关闭Socket时主线程的Socket还没创建好?注意线程间数据的共享。
#5
关闭Socket时,Socket肯定创建好的。执行ReSocket.Close()时,程序崩溃掉。
#6
可能你在关闭Socket时,主线程正在对Socket做其它操作,你的Socket有没有加同步控制?
#7
顶ffffff
#8
可能是你线程close掉之后 别的地方可能有发送 或 接受的操作。
在发送或接受的地方 先判断 IsConnect() 的话 再操作。
在发送或接受的地方 先判断 IsConnect() 的话 再操作。
#9
其他地方没用到。我把线程改为函数形式就没问题。是不是主程序创建的Socket,线程不能用Close关闭释放Socket资源啊?貌似反过来也不行,即在线程中创建的Socket,主程序也不能用Close关闭释放Socket资源!
#10
发消息给主线程,让主线程自己关闭套接字
#11
我这些程序写在DLL中的。没窗体。怎么发消息。给个实例,谢谢?
#12
可以尝试在线程中 new CSocket,然后Attach父线程创建的CSocket的SOCKET
#13
我记得在VC6 下是不允许的,CSocket::Create函数,只允许拥有WindowProc的线程调用,因为调用这个函数,将会把OnAccept,OnConnect,OnRead,OnSend等消息处理,封装到消息循环中去处理,同样的
CSocket::Close将会把上述的消息循环取消.所以调用Create和Close函数,都必须是创建窗体的线程(一般都是主线程),否则会报异常
CSocket::Close将会把上述的消息循环取消.所以调用Create和Close函数,都必须是创建窗体的线程(一般都是主线程),否则会报异常
#14
你接受发送数据的线程跟Close的线程是不是同一个?如果不是,那就把他们挪到主线程里去,而原来执行Close的线程只要把调用Close的那句代码换成发送信号量给主线程,主线程收到信号量后就调用Close并退出。至于如何使用Windows的信号量,请看《Windows核心编程》。
#15
定义一个bool变量,在主线程里把这个值赋为false,当你子线程需要关闭主线程里的socket时,把这个值置为true,当主线程发现这个值为true时,关闭此socket即可。
#16
我想换思路解决这个问题,但碰到新的问题。我在线程中主要是为了一直连接服务端,不在函数中写这个连接是为了不影响主程序。所以我想在线程中新创建一个Socket进行连接服务端。当线程连接成功以后。在用主程序中的Socket进行连接服务端。但线程结束以后怎样告知主程序线程已经结束了呢?不要用一直判断的方式去判断线程是否结束,这样会影响主程序。最好发送消息命令的方式。当线程结束以后,发送一个命令通知主程序,线程已经结束。我的程序写在一个DLL中,但SendMessage好像针对的是窗体。请问DLL中如何进行消息传递??谢谢
#17
如果定义一个bool变量,那主程序就需要一直判断是否为true。影响主程序。这样就失去我写成线程的意义了。
#18
在dll中传入窗口句柄就可以使用SendMessage了
#19
CSocket不是线程安全的