- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
如何用c编一个聊天程序
MFC编写聊天程序总结
(2008-03-20 11:38:44)
转载
标签:
it 分类: 网络 ?孙鑫的多线程与聊天室程序的创建,照样子自己也写了个多线程的聊天程序。以免以后忘了,在此小总结一下下:
?1.首先利用对话框建立聊天程序的界面:如下
最上面是一个接受数据的编辑框,下面分别是一个Ip地址控件和发送数据的编辑框,左下角是触发发送数据的按钮。
2.加载套接字库,在MFC中用AfxSocketInit()加载套接字库。需要注意的是这个函数要在程序的初始化函数中调用,即在Appliacation的InitInstance()中调用AfxSocketInit();
3.初始化套接字。在对话框中添加一个成员函数SockInit(),用来初始化套接字,然后在对话框初始化函数OnInitDlg()中调用SockInit()。Tip:因为聊天程序既包含接收端又包含发送端,所以需要绑定Ip和端口。
4.创建多线程。接受数据时,如没有数据到来,则会阻塞,导致程序暂停运行,所以把接受数据工作放到单独的线程中。在OnInitDlg()中创建多线程。Tip:因为需要给线程传递一个通信的套接字和响应消息的窗口句柄,所以需要额外定义一个结构体,用来存储这两个参数。
struct RECVPARAM{?HWND hWnd;?????????? //接收数据窗体的句柄?SOCKET sock;???????? //接收数据的套接字};
5.实现线程过程函数。Tip:如果要求不能用全局函数的话,那线程过程函数就要定义为static(它属于类本身).在线程过程函数中循环接受消息,利用::PostMessgae()函数给接受数据编辑框发送消息,以实现显示信息的功能
6.自定义消息的实现。因为在PostMessage中是自定义的消息(WM_RECVDATA),所以需要完成消息映射。(1)定义消息值#define WM_RECVDATA WM_USER+1 (2)声明消息处理函数:afx_msg void OnRecvData(WPARAM wParam,LPARAM lParam);(3)完成消息映射:ON_MESSAGE(WM_RECVDATA,OnRecvData)
7.实现OnRecvData()函数。显示接收到的信息
8.实现OnButtonSend()函数。发送消息
?
希望下午能够在自己的聊天程序中实现多线程。呵呵!
?
2---------------
/sakura006/default.html
编写一个基于MFC对话框的聊天程序:1.新建一个基于MFC项目工程Chat2.加载套接字库,有下面两种方法,在这里选择第二种方法,因为更方便。
方法一、使用WSAStartup()加载套接字库参考MSDN中的范例代码,拷贝到自己的程序中修改即可。* 注意不再使用套接字后调用WSACleanup()。
Header: Winsock2.h.Link Library: Ws2.lib. // #pragma comment(lib,ws2_32)
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return;
}
方法二、使用AfxSocketInit()加载套接字库(MFC)BOOL AfxSocketInit(?? WSADATA* lpwsaData = NULL );参数1:指向WSADATA结构体的指针。
WSAData机构体如下 功能是:存放windows socket初始化信息. struct WSAData { WORD wVersion; WORD wHighVersion; char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYSSTATUS_LEN+1]; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; }; wVersion为你将使用的Winsock版本号,wHighVersion为载入的
文档评论(0)