访问已传递给线程的套接字
Access a socket that has been passed to thread
我是MFC的CWinThread
和CAsyncSocket
的新手,并尝试通过基于对话框的应用程序自己学习它们。
这就是我想做的:做一个服务器/多客户端模型:当客户端数量连接到服务器时,服务器会根据客户端数量做线程,并传递套接字连接到线程。我参考了这篇文章来做通过:https://support.microsoft.com/en-us/kb/175668 .
我已经成功地在每个连接上制作了线程,但是...
我的问题是:我可以从主窗口(GUI(重新访问已传递给线程的所有套接字以向所有客户端发送(广播(数据吗?
这是我传球的方式:
在服务器端:
void CMyServerDlg::OnAccept(){
CConnectSoc temp_soc;
m_Listener.Accept(temp_soc);
CSocketThread *pThr = (CSocketThread*)AfxBeginThread(
RUNTIME_CLASS(CSocketThread),
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pThr->threadHandleSocket = temp_soc.Detach();
pThr->ResumeThread();
}
注意:m_Listener
是从 CAsyncSocket
派生的类的对象,CSocketThread
是从 CWinThread
派生的。
在线程标题中,我添加了 2 行:
Public:
CConnectSoc threadSocket;
SOCKET threadHandleSocket;
在线程类.cpp内部:
BOOL CSocketThread::InitInstance(){
threadSocket.Attach(threadHandleSocket);
return TRUE;
}
有人可以告诉我下一步该怎么做才能将数据发送到这些套接字吗?
经过一番研究,我终于觉得我可以回答我自己的问题了,谢谢你的帮助;但是请修复我,如果有更好的解决方案或我的不是一个好的做法。
我的解决方案:
这里的关键词是PostMessage()
和PostThreadMessage()
。我们必须在 GUI 和线程之间进行通信。但是,问题是线程无法调用PostMessage()
这是CWnd
的成员函数,用于向 GUI 发送消息(我不知道为什么不这样做(。所以我需要在线程类中有一个指针来指向 GUI 中的 CWnd:
在线程类的标头中:
public:
CWnd *wParrent;
然后在创建线程的阶段,我只需要添加 1 行:
void CMyServerDlg::OnAccept(){
CConnectSoc temp_soc;
m_Listener.Accept(temp_soc);
CSocketThread *pThr = (CSocketThread*)AfxBeginThread(
RUNTIME_CLASS(CSocketThread),
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pThr->wParrent = this; //<== this line
pThr->threadHandleSocket = temp_soc.Detach();
pThr->ResumeThread();
}
通过这样做,我现在可以从线程发布消息,为GUI提供我的线程ID。
在线程.cpp中:
BOOL CSocketThread::InitInstance(){
threadSocket.Attach(threadHandleSocket);
wParrent->PostMessage(THREAD_STARTED, 0, (LPARAM)m_nThreadID);
return TRUE;
}
然后在 GUI:我们使用存储m_nThreadID
以备将来使用的功能处理消息THREAD_STARTED
:
在 Dlg 标头中的某个地方:
CDWordArray m_threadIDs;
Dlg .cpp
LRESULT CMyServer3Dlg::OnThreadStart(WPARAM, LPARAM lParam){
DWORD ThreadID = (DWORD)lParam;
m_threadIDs.Add(ThreadID);
return 0;
}
将数据发送到所有客户端时,请在循环中使用PostThreadMessage()
m_ThreadIDs
:
for (int i =0; i<m_threadIDs.GetCount(); ++i){
PostThreadMessage(m_threadIDs[i],SEND_DATA,(WPARAM)bufferSize,(LPARAM)socketBuffer);
}
使用函数处理线程中的SEND_DATA
消息以执行发送:
在线程 .cpp:
void CSocketThread::SendDataFunc(WPARAM wParam, LPARAM lParam){
ASSERT(threadSocket != NULL);
if(threadSocket == NULL)
{
return;
}
else
{
char *socketBuffer = (char*)lParam;
int bufferSize = (int)wParam;
send(threadSocket, socketBuffer, bufferSize, 0);
}
这就是我所做的,到目前为止没有问题....
- 接受线程 C++ 套接字中的函数循环
- 关于套接字通信的线程
- 用于线程间通信的 Windows 套接字
- 具有多线程应用程序的 Nanomsg 无阻塞双向套接字
- 套接字发送(.)线程的最佳数量
- 包含线程后C++套接字错误WSAENOTSOCK (10038)
- 多线程套接字编程服务器仅从 1 个客户端线程获取消息
- 每个线程或每个调用一个 ZeroMQ 套接字
- QSocketNotifier:不能从另一个线程启用或禁用套接字通知程序
- 使用Berkeley套接字的线程通知
- 在多线程HTTP服务器中发送后,如何干净地关闭套接字
- C /Linux:如何编写使用套接字的线程安全库
- windows DLL是否有可能在多个线程或进程之间使用相同的套接字编号
- c++系统()挂起,使用netcat连接到不同线程中的套接字
- 访问已传递给线程的套接字
- 提升同一对象上的异步套接字和线程池io_service
- c++tcp多线程客户端/服务器-如何与线程套接字处理程序进行通信
- 多线程套接字超时
- c++多线程套接字无法接收客户端数据
- 多线程套接字操作与进度条更新