csocket或CAsyncSocket建立的聊天软件,如何像QQ那样,点击列表产生任意个对话框,然后可以随意聊天?一般网上的是一对一的聊天的实例,没见到一对多的像QQ那样的,请高手告诉我如何实现?如果有实例的话可以发去我邮箱:[email protected] 。
解决方案 »
- 如何让WebBrowser控件(不是IE进程)自动装载BHO?
- 如何提取系统图标?
- 想買本書,大家提議一下
- 调查有几家公司开始用vc++.net?来者有分
- 我的视图(基类是CFormView)中加了一个CListCtrl,可是怎么让它大小变化?
- DLL共享内存的问题
- JAVA的类的属性可以直接引用。不用声明对象。C++的类的属性到底能不能直接引用,给个例子行吗?MFC类的属性能直接用吗?
- 帮帮忙啊!我的vs.net装了之后为什么帮助文档显不出来,包括msdn!1G的帮助文件都在!解决了一定给分!
- MFC的SOCKET编程怎么实现两个软件之间的通讯?
- visual studio2008 c++出错
- tcp客户端socket绑定端口后,无法连接局域网内的tcp服务器
- 关于hdc的问题
一对多,多连几个socket不就可以了
在主程序窗口:有个监听SOCKET Socket用于监听会话请求,同时有SOCKET AcceptSocket[20]用于接受请求并会话。来一个会话请求,就从20个AcceptSocket中选个空的AcceptSocket与之连接弹出聊天窗口,并设置该Socket的WM_SOCKET_READ消息的处理窗口句柄。同时还有个SOCKET SendSocket用于发送请求,连接成功后同样设置消息。这样楼主就同时可以和21个人进行会话了。
下面是我曾经做的一个类似QQ的点对点聊天程序,测试通过的,多用户多窗口聊天。希望对楼主有所帮助
afx_msg LRESULT CSimpleQDlg::OnServerAccept(WPARAM wParam, LPARAM lParam)
{
int nLength = sizeof(SOCKADDR);
SOCKADDR_IN addr;
int i;
if (WSAGETSELECTEVENT(lParam) == FD_ACCEPT)
{
for(i=0;(i<20)&&(m_hAcceptSocket[i]!=INVALID_SOCKET);i++) ;//查找空闲AcceptSocket
if(i==20) return 0; //没有空闲AcceptSocket,直接退出
m_hAcceptSocket[i] = accept(m_hServerSocket, (LPSOCKADDR)&addr, (LPINT)&nLength);
//连接成功后首先发生自己的昵称
int iSize = WideCharToMultiByte(CP_ACP,0,m_staticName,-1,NULL,0,NULL,NULL);
char *na = new char[iSize];
WideCharToMultiByte(CP_ACP,0,m_staticName,-1,na,iSize,NULL,NULL);//转化CString类型的IP为char *
send(m_hAcceptSocket[i],na,strlen(na),0); CSimpleQWordChat *sqwc=new CSimpleQWordChat();
sqwc->SetNickName(m_staticName);
sqwc->SetPeerIP(CString(inet_ntoa(addr.sin_addr)));
sqwc->Create(IDD_DIALOG_WORDCHAT,GetDesktopWindow());
//这一句必须放在Create之后,因为此时窗体句柄m_hWnd才会分配空间
sqwc->SetSocket(m_hAcceptSocket[i]);
sqwc->ShowWindow(SW_SHOW);
sqwc->UpdateData(false);
}
return 0;
}void CSimpleQWordChat::SetSocket(SOCKET& socket)
{
m_hSocket=socket;
//自定义消息
WSAAsyncSelect(m_hSocket,this->m_hWnd,WM_SOCKET_READ,FD_READ);
}要自己处理添加消息处理函数:ON_MESSAGE(WM_SOCKET_READ, &CSimpleQWordChat::OnSocketRead)
这样某个Socket有数据到来后后就会向指定的窗口m_hWnd发送消息WM_SOCKET_READ,FD_READ是消息通知码。各个窗口间不干扰!