VC WSA 异步非阻塞网络编程WSARecvFrom调用失败;下面是主要代码,发送是成功的,但是接受的时候总是不成功,接受到的数据为空,BOOL CChatToDlg::InitSocket(void)
{
m_socket = ::WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0);
if(INVALID_SOCKET == m_socket)
{
::AfxMessageBox(L"创建套接字失败");
return false;
} SOCKADDR_IN addrSock;
addrSock.sin_addr.S_un.S_addr = htonl(ADDR_ANY);
addrSock.sin_family = AF_INET;
addrSock.sin_port = htons(6000); if(SOCKET_ERROR == bind(m_socket,(SOCKADDR *)&addrSock,sizeof(SOCKADDR)))
{
::AfxMessageBox(L"绑定套接字失败");
return false;
} if(INVALID_SOCKET == ::WSAAsyncSelect(m_socket,m_hWnd,MSG_SOCK,FD_READ))
{
::AfxMessageBox(L"创建套接字失败");
return false;
} return true;
}
LRESULT CChatToDlg::OnMsgSock(WPARAM wParam,LPARAM lParam)
{
switch(LOWORD(lParam))
{
case FD_READ:
WSABUF wsabuf;
wsabuf.buf = new char[200];
::memset(wsabuf.buf,0,200);
wsabuf.len = 200; DWORD dwRead;
DWORD dwFlag;
SOCKADDR_IN addrFrom;
int len = sizeof(SOCKADDR); CString str;
CString strTemp; ::WSARecvFrom(m_socket,&wsabuf,1,&dwRead,&dwFlag,
(SOCKADDR *)&addrFrom,&len,NULL,NULL);
/*if(SOCKET_ERROR == )
{
//::AfxMessageBox(L"接收信息失败了");
SendMessage(WM_CLOSE,0,0);
return 0;
}// if*/ // 注意要加L;
//str.Format(L"%s 说 : %s",inet_ntoa(addrFrom.sin_addr),wsabuf.buf);
str.Format(L"我 说 : %s",wsabuf.buf);
str += L"\r\n";
GetDlgItemTextW(IDC_EDIT_RECV,strTemp);
str += strTemp;
  SetDlgItemTextW(IDC_EDIT_RECV,str);
break;
}
return 0;
}void CChatToDlg::OnBnClickedBtnSend()
{
// TODO: 在此添加控件通知处理程序代码
DWORD dwIP; ((CIPAddressCtrl *)GetDlgItem(IDC_IPADDRESS))->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;
GetDlgItemTextW(IDC_EDIT_SEND,strSend); WSABUF wsabuf;
DWORD dwSend;
int len = strSend.GetLength(); wsabuf.buf = new char[200];
::memset(wsabuf.buf,0,200);
wsabuf.len = 200;
wsabuf.buf[199] = '\0';
::WideCharToMultiByte(CP_ACP,0,strSend,len,wsabuf.buf,len+1,NULL,NULL);
wsabuf.buf[len] = '\0';
SetDlgItemTextW(IDC_EDIT_SEND,L"");
if(SOCKET_ERROR == ::WSASendTo(m_socket,&wsabuf,1,&dwSend,0,
(SOCKADDR *)&addrTo,sizeof(SOCKADDR),NULL,NULL))
{
::AfxMessageBox(L"发送信息失败了");
return;
}// if
}
BOOL CChatToDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码
m_socket = 0;
InitSocket();
return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}