织梦CMS - 轻松建站从此开始!

罗索

网络聊天程序(基于消息的异步套接字编程)

jackyhwei 发布于 2011-05-25 17:22 点击:次 
基于消息的异步套接字编程网络聊天程序源代码
TAG:

BOOL CChatApp::InitInstance()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {

   return FALSE;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 2 ) {

   WSACleanup( );
   return FALSE;
}

......
}

BOOL CChatDlg::InitSocket()
{
m_socket=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0);    //创建套接字
if(INVALID_SOCKET==m_socket)
{
   MessageBox("套接字创建失败!");
   return FALSE;
}

SOCKADDR_IN addrSock;
addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(6000);

if(SOCKET_ERROR==bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR)))
{
   //closesocket(m_socket);
   MessageBox("绑定失败!");
   return FALSE;
}

if(SOCKET_ERROR==WSAAsyncSelect(m_socket,m_hWnd,UM_SOCK,FD_READ))    //请求基于消息的网络事件通知函数,此处注册网络读取事件
{
   MessageBox("注册网络读取事件失败!");
   return FALSE;
}

return TRUE;
}

BOOL CChatDlg::OnInitDialog()
{
......
// TODO: Add extra initialization here
InitSocket();     //函数调用


return TRUE; // return TRUE unless you set the focus to a control
}

在头文件中定义消息值:#define UM_SOCK WM_USER+1
在头文件中进行消息响应函数原型的声明 afx_msg void OnSock(WPARAM,LPARAM); 在源文件中进行消息映射 ON_MESSAGE(UM_SOCK,OnSock)

void CChatDlg::OnSock(WPARAM wParam,LPARAM lParam)     //接收数据的消息响应函数
{
switch(LOWORD(lParam))
{
case FD_READ:
   WSABUF wsabuf;
   wsabuf.buf=new char[200];
   wsabuf.len=200;
   DWORD dwRead;
   DWORD dwFlag=0;
   SOCKADDR_IN addrFrom;
   int len=sizeof(SOCKADDR);
//  WSARecvFrom(m_socket,&wsabuf,1,&dwRead,&dwFlag,
//    (SOCKADDR*)&addrFrom,&len,NULL,NULL);    //也可不作下面的判断
   if(SOCKET_ERROR==WSARecvFrom(m_socket,&wsabuf,1,&dwRead,&dwFlag,
    (SOCKADDR*)&addrFrom,&len,NULL,NULL))
   {
    MessageBox("接收数据失败!");
    return;
   }
HOSTENT *pHost;
pHost=gethostbyaddr((char*)&addrFrom.sin_addr.S_un.S_addr,4,AF_INET);

   CString str;
   CString strTemp;
   //str.Format("%s 说: %s",inet_ntoa(addrFrom.sin_addr),wsabuf.buf); //消息中显示IP地址
   str.Format("%s 说: %s",pHost->h_name,wsabuf.buf); //消息中显示主机名
   str+="\r\n";
   GetDlgItemText(IDC_EDIT_RECV,strTemp);
   str+=strTemp;
   SetDlgItemText(IDC_EDIT_RECV,str);
   break;
}
}

/*void CChatDlg::OnBtnSend() //通过IP地址发送数据
{
// TODO: Add your control notification handler code here
DWORD dwIP;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);

SOCKADDR_IN addrTo;
addrTo.sin_addr.S_un.S_addr=htonl(dwIP);
addrTo.sin_family=AF_INET;
addrTo.sin_port=htons(6000);

CString strSend;
int len;
GetDlgItemText(IDC_EDIT_SEND,strSend);
len=strSend.GetLength();
WSABUF wsabuf;
wsabuf.buf=strSend.GetBuffer(len);    //CString转换为char *
wsabuf.len=len+1;

DWORD dwSend;
SetDlgItemText(IDC_EDIT_SEND,"");

if(SOCKET_ERROR==WSASendTo(m_socket,&wsabuf,1,&dwSend,0,
   (SOCKADDR*)&addrTo,sizeof(SOCKADDR),NULL,NULL))
{
   MessageBox("发送数据失败!");
   return;
}
}*/

void CChatDlg::OnBtnSend() //通过主机名或IP地址发送数据
{
// TODO: Add your control notification handler code here
CString strHostName;
SOCKADDR_IN addrTo;
HOSTENT* pHost;
if(GetDlgItemText(IDC_EDIT_HOSTNAME,strHostName),strHostName=="") //未输入主机名
{
   DWORD dwIP;
   ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);
   addrTo.sin_addr.S_un.S_addr=htonl(dwIP);
}
else     //通过主机名获取IP地址
{
   pHost=gethostbyname(strHostName);
   addrTo.sin_addr.S_un.S_addr=*((DWORD*)pHost->h_addr_list[0]);
}

addrTo.sin_family=AF_INET;
addrTo.sin_port=htons(6000);

CString strSend;
int len;
GetDlgItemText(IDC_EDIT_SEND,strSend);
len=strSend.GetLength();
WSABUF wsabuf;
wsabuf.buf=strSend.GetBuffer(len);    //CString转换为char *
wsabuf.len=len+1;

DWORD dwSend;
SetDlgItemText(IDC_EDIT_SEND,"");

if(SOCKET_ERROR==WSASendTo(m_socket,&wsabuf,1,&dwSend,0,
   (SOCKADDR*)&addrTo,sizeof(SOCKADDR),NULL,NULL))
{
   MessageBox("发送数据失败!");
   return;
}
}

(studyarea)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201105/12961.html]
本文出处:百度博客 作者:studyarea
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容