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) |