- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
VC实现简单聊天工具实践
显然大家都用过QQ等聊天工具,也或许有想弄明白其中的工作原理,学过编程的朋友或许还会希望自己也能设计出一款差不多的程序软件。在这里我根据孙鑫老师讲的VC教程,整理出来了一个程序,不敢说我对这方面弄得很明白,只是将我实现这个软件的过程向有需要的朋友介绍下,如果恰好能给予方便,自是倍感安慰,权当闲暇之余的消遣罢了。
闲话就不多说了,下面详细介绍其实现过程,有不完善之处,请有心人及时反映给我,共同进步,谢谢!(实现语言:VC++)
步骤:
打开VC++6.0,创建一个MFC AppWizard(exe),工程名为:CHART,选择但文档类型,在应用程序向导第六步将基类改为“CView”,单击“完成”,创建完成。
在其生成的对话框IDD_CHART_FORM中添加控件:
控件名称 控件ID 控件标题 组框 IDC_STATIC 接收信息: 组框 IDC_STATIC 发送信息: 编辑框 IDC_EDIT_RECEIVE 编辑框 IDC_EDIT_SEND IP地址 IDC_IPADDRESS1 静态文本 ID: 按钮 IDC_BTN_SEND 发送
在CCHARTView中添加成员变量:SOCKET m_socket;
在CHARTView.h添加结构体:
struct RECEIVE
{
SOCKET sock;
HWND hwnd;
};
在CCHARTView中添加成员函数:BOOL InitSocket();
函数代码:
BOOL CCHARTView::InitSocket()
{
m_socket=socket(AF_INET,SOCK_DGRAM,0);
//创建一个能够进行网络通信的套接字
if(INVALID_SOCKET==m_socket)
{
MessageBox(套接字创建失败!);
return FALSE;
}
SOCKADDR_IN AddrSock;
AddrSock.sin_family=AF_INET;
//指代协议族,在socket编程中只能是AF_INET,代表TCP/IP协议族。
AddrSock.sin_port=htons(6000);
//存储端口号(使用网络字节顺序)
AddrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
//sin_addr存储IP地址,s_addr按照网络字节顺序存储IP地址
int retwal;
retwal=bind(m_socket,(SOCKADDR *)AddrSock,sizeof(SOCKADDR));
//将套接字绑定到IP和端口上
if(SOCKET_ERROR==retwal)
{
closesocket(m_socket);
MessageBox(绑定失败!);
return FALSE;
}
return TRUE;
}
添加成员函数:DWORD WINAPI RecvPrac(LPVOID lpParaneter);//作为一个线程
函数代码:
DWORD WINAPI CCHARTView::RecvPrac(LPVOID lpParaneter)
{
SOCKET sock=((RECEIVE*)lpParaneter)-sock;
HWND hwnd=((RECEIVE*)lpParaneter)-hwnd;
SOCKADDR_IN addrFrom;
int len=sizeof(SOCKADDR);
char recvBuf[200];
char tempBuf[300];
int retval;
while(TRUE)
{
retval=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)addrFrom,len);
/*recvfrom()函数各参数意义:
1是标识一个已连接套接口的描述字,2是接收数据缓冲区,
3是缓冲区长度,4是调用操作方式,
5(可选)是指向装有原地址的缓冲区,
6(可选)指向from缓冲区长度值
*/
if(SOCKET_ERROR==retval)
break;
CTime tm;
tm=CTime::GetCurrentTime();
CString time;
time=tm.Format(【%H:%M:%S】);
sprintf(tempBuf,%s\t%s 说:\r\n\t%s\r\n, inet_ntoa(addrFrom.sin_addr), time,recvBuf);
::PostMessage(hwn
文档评论(0)