VC++服务器程序,怎样在两个线程中同时使用一个套接字?请教大家

时间:2022-06-21 11:00:28
我用MFC建了一个基于对话框的程序。我要编一个服务器端程序,服务器端套接字和客户端套接字(SOCKET c_sockConn; )是定义在一个communication类里面的。把建立套接字、绑定、侦听、及accpet()做成一个函数在OnInitDialog()函数中调用。因为编写的是一个集中器程序,服务器和套接字连上了后,还要等待心跳帧并且应答后,才能发送命令。所以想建两个线程,一个线程是专门应答心跳帧的(接收心跳帧报文并发送相应的报文),让集中器在线叫做线程1。另一个线程,是用来发送和接收通信报文的,叫作线程2。两个线程都是在communication类中声明的友元函数。我在OnInitDialog()函数中调用专门应答心跳帧的线程,叫做线程;新建一个按钮button1调用一个线程2。两个线程同时调用套接字c_sockConn,可是为什么在线程1中套接字是正常的,而线程2中的套接字是 3435973836,发送和接收报文都不行,接收的报文长度为-1。请问:这是为什么?c_sockConn是一个类中的全局变量呀,怎样才能在线程2中使用,在OnInitDialog()函数中建好的c_sockConn?请教各位高手,谢谢!

11 个解决方案

#1


通过一个单件类的接口访问。

#2


同步socket

#3


我在两个线程中,同时要接收和发送数据,使两个线程接收到客户端的数据相同,发送的数据不同.同步socket应该如何使用?可以解决我的问题吗?

#4


初学者,请各位说的具体一点吧?应该怎样使用呀?

#5


各位指点一下吧!很疑惑,以前也没怎么接触过线程。

#6


锁定SOCKET缓冲区,给你段代码吧。
    EnterCriticalSection(&pdlg->Section_work[pthreadarg->i]);
   send(pdlg->m_data_pack[pthreadarg->i].GetHead().sockinfo.sock,(char*) 
       (&my_data.packhead),sizeof(my_data.packhead),0);
   LeaveCriticalSection(&pdlg->Section_work[pthreadarg->i]);
           

#7


如果不能安全跨线程操作,就在使用前上锁,用完解锁

#8


就是避免多线程同时操作sock.
一般send_thread recv_thread. accept_thread

#9


你创建线程2的时候,可以将SOCKET套接字句柄作为线程函数的参数传递进入即可。

#10


怎么不给分啊?

#11


将socket句柄当做线程堆栈参数传递到线程中去,或者找个socket管理类,然后想法吧找个socket管理类放进去,通过这个类可以收发数据,以及心跳的处理,断线。

#1


通过一个单件类的接口访问。

#2


同步socket

#3


我在两个线程中,同时要接收和发送数据,使两个线程接收到客户端的数据相同,发送的数据不同.同步socket应该如何使用?可以解决我的问题吗?

#4


初学者,请各位说的具体一点吧?应该怎样使用呀?

#5


各位指点一下吧!很疑惑,以前也没怎么接触过线程。

#6


锁定SOCKET缓冲区,给你段代码吧。
    EnterCriticalSection(&pdlg->Section_work[pthreadarg->i]);
   send(pdlg->m_data_pack[pthreadarg->i].GetHead().sockinfo.sock,(char*) 
       (&my_data.packhead),sizeof(my_data.packhead),0);
   LeaveCriticalSection(&pdlg->Section_work[pthreadarg->i]);
           

#7


如果不能安全跨线程操作,就在使用前上锁,用完解锁

#8


就是避免多线程同时操作sock.
一般send_thread recv_thread. accept_thread

#9


你创建线程2的时候,可以将SOCKET套接字句柄作为线程函数的参数传递进入即可。

#10


怎么不给分啊?

#11


将socket句柄当做线程堆栈参数传递到线程中去,或者找个socket管理类,然后想法吧找个socket管理类放进去,通过这个类可以收发数据,以及心跳的处理,断线。