线程中如何关闭主程序中的套接字

时间:2021-08-09 01:49:04
我定义一个全局变量套接字CSocket ReSocket,在主程序中创建并连接服务端【ReSocket.Create(0,SOCK_STREAM,0))
ReSocket.Connect(ip,port)】。我在一个线程中关闭ReSocket.Close()该套接字时出错。请问线程中能不能关闭主线程中创建的套接字?如果可以,该如何关闭?反之,线程中创建的套接字,在主程序中如何关闭?谢谢!!

19 个解决方案

#1


帮顶,等待高手解答

#2



我建议你用引用计数这样的技术。

#3


我建议你用引用计数这样的技术。????????能不能说明白一点?谢谢

#4


“请问线程中能不能关闭主线程中创建的套接字?”应该可以啊,返回什么错误?是不是你线程关闭Socket时主线程的Socket还没创建好?注意线程间数据的共享。

#5


关闭Socket时,Socket肯定创建好的。执行ReSocket.Close()时,程序崩溃掉。

#6


引用 5 楼 xiwang1998 的回复:
关闭Socket时,Socket肯定创建好的。执行ReSocket.Close()时,程序崩溃掉。
可能你在关闭Socket时,主线程正在对Socket做其它操作,你的Socket有没有加同步控制?

#7


顶ffffff

#8


可能是你线程close掉之后  别的地方可能有发送 或 接受的操作。

在发送或接受的地方 先判断 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函数,都必须是创建窗体的线程(一般都是主线程),否则会报异常

#14


引用 9 楼 xiwang1998 的回复:
其他地方没用到。我把线程改为函数形式就没问题。是不是主程序创建的Socket,线程不能用Close关闭释放Socket资源啊?貌似反过来也不行,即在线程中创建的Socket,主程序也不能用Close关闭释放Socket资源!

你接受发送数据的线程跟Close的线程是不是同一个?如果不是,那就把他们挪到主线程里去,而原来执行Close的线程只要把调用Close的那句代码换成发送信号量给主线程,主线程收到信号量后就调用Close并退出。至于如何使用Windows的信号量,请看《Windows核心编程》。

#15


定义一个bool变量,在主线程里把这个值赋为false,当你子线程需要关闭主线程里的socket时,把这个值置为true,当主线程发现这个值为true时,关闭此socket即可。

#16


我想换思路解决这个问题,但碰到新的问题。我在线程中主要是为了一直连接服务端,不在函数中写这个连接是为了不影响主程序。所以我想在线程中新创建一个Socket进行连接服务端。当线程连接成功以后。在用主程序中的Socket进行连接服务端。但线程结束以后怎样告知主程序线程已经结束了呢?不要用一直判断的方式去判断线程是否结束,这样会影响主程序。最好发送消息命令的方式。当线程结束以后,发送一个命令通知主程序,线程已经结束。我的程序写在一个DLL中,但SendMessage好像针对的是窗体。请问DLL中如何进行消息传递??谢谢

#17


引用 15 楼 liuzunde 的回复:
定义一个bool变量,在主线程里把这个值赋为false,当你子线程需要关闭主线程里的socket时,把这个值置为true,当主线程发现这个值为true时,关闭此socket即可。

如果定义一个bool变量,那主程序就需要一直判断是否为true。影响主程序。这样就失去我写成线程的意义了。

#18


在dll中传入窗口句柄就可以使用SendMessage了

#19


CSocket不是线程安全的

#1


帮顶,等待高手解答

#2



我建议你用引用计数这样的技术。

#3


我建议你用引用计数这样的技术。????????能不能说明白一点?谢谢

#4


“请问线程中能不能关闭主线程中创建的套接字?”应该可以啊,返回什么错误?是不是你线程关闭Socket时主线程的Socket还没创建好?注意线程间数据的共享。

#5


关闭Socket时,Socket肯定创建好的。执行ReSocket.Close()时,程序崩溃掉。

#6


引用 5 楼 xiwang1998 的回复:
关闭Socket时,Socket肯定创建好的。执行ReSocket.Close()时,程序崩溃掉。
可能你在关闭Socket时,主线程正在对Socket做其它操作,你的Socket有没有加同步控制?

#7


顶ffffff

#8


可能是你线程close掉之后  别的地方可能有发送 或 接受的操作。

在发送或接受的地方 先判断 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函数,都必须是创建窗体的线程(一般都是主线程),否则会报异常

#14


引用 9 楼 xiwang1998 的回复:
其他地方没用到。我把线程改为函数形式就没问题。是不是主程序创建的Socket,线程不能用Close关闭释放Socket资源啊?貌似反过来也不行,即在线程中创建的Socket,主程序也不能用Close关闭释放Socket资源!

你接受发送数据的线程跟Close的线程是不是同一个?如果不是,那就把他们挪到主线程里去,而原来执行Close的线程只要把调用Close的那句代码换成发送信号量给主线程,主线程收到信号量后就调用Close并退出。至于如何使用Windows的信号量,请看《Windows核心编程》。

#15


定义一个bool变量,在主线程里把这个值赋为false,当你子线程需要关闭主线程里的socket时,把这个值置为true,当主线程发现这个值为true时,关闭此socket即可。

#16


我想换思路解决这个问题,但碰到新的问题。我在线程中主要是为了一直连接服务端,不在函数中写这个连接是为了不影响主程序。所以我想在线程中新创建一个Socket进行连接服务端。当线程连接成功以后。在用主程序中的Socket进行连接服务端。但线程结束以后怎样告知主程序线程已经结束了呢?不要用一直判断的方式去判断线程是否结束,这样会影响主程序。最好发送消息命令的方式。当线程结束以后,发送一个命令通知主程序,线程已经结束。我的程序写在一个DLL中,但SendMessage好像针对的是窗体。请问DLL中如何进行消息传递??谢谢

#17


引用 15 楼 liuzunde 的回复:
定义一个bool变量,在主线程里把这个值赋为false,当你子线程需要关闭主线程里的socket时,把这个值置为true,当主线程发现这个值为true时,关闭此socket即可。

如果定义一个bool变量,那主程序就需要一直判断是否为true。影响主程序。这样就失去我写成线程的意义了。

#18


在dll中传入窗口句柄就可以使用SendMessage了

#19


CSocket不是线程安全的

#20