注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

从C开始

 
 
 

日志

 
 

异步套接字编程  

2010-11-21 19:43:03|  分类: MFC |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

//由于使用了套接字2.0版本中的函数,所以我们在套接字的版本协商中,应该使用2.2版本的socket
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 CSocketDlg::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)))
{
MessageBox("套接字绑定失败!");
return FALSE;
}
//请求一个基于Windows消息的网络事件通知
if (SOCKET_ERROR == WSAAsyncSelect(m_socket, m_hWnd, UM_READ, FD_READ))
{
MessageBox("注册网络读取事件失败!");
return FALSE;
}

return TRUE;
}

//UM_READ消息响应函数
void CSocketDlg::OnRead(WPARAM wParam, LPARAM lParam)
{
if (LOWORD(lParam) == FD_READ)
{
WSABUF readBuf;
readBuf.buf = new char[200];
readBuf.len = 200;

DWORD dwNumberOfBytesRecvd;
sockaddr_in addrFrom;
int len = sizeof(sockaddr);

DWORD dwFlags = 0;

CString str;
CString strTemp;

if (SOCKET_ERROR == WSARecvFrom(m_socket, &readBuf, 1, &dwNumberOfBytesRecvd, 
&dwFlags, (sockaddr*)&addrFrom, &len, NULL, NULL))
{
MessageBox("套接字连接失败!");
delete [] readBuf.buf;
return;
}

str.Format("%s says %s", inet_ntoa(addrFrom.sin_addr), readBuf.buf);
str += "\r\n";
GetDlgItemText(IDC_EDIT1, strTemp); 
str = strTemp + str;
SetDlgItemText(IDC_EDIT1, str);
delete[] readBuf.buf;
}
}

//发送消息
void CSocketDlg::OnBtnSend() 
{
// TODO: Add your control notification handler code here
DWORD dwIp;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIp);

sockaddr_in addrSendto;
addrSendto.sin_addr.S_un.S_addr = htonl(dwIp);
addrSendto.sin_family = AF_INET;
addrSendto.sin_port = htons(6000);
CString strSend;
GetDlgItemText(IDC_EDIT2, strSend);
int len;
len = strSend.GetLength();

WSABUF sendBuf;
sendBuf.buf = strSend.GetBuffer(len);
sendBuf.len = len + 1;

DWORD dwSend;
if (SOCKET_ERROR == WSASendTo(m_socket, &sendBuf, 1, &dwSend, 0, (sockaddr*)&addrSendto, sizeof(sockaddr), NULL, NULL))
{
MessageBox("发送数据失败!");
return;
}
}
  评论这张
 
阅读(372)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018