VC WSA 异步非阻塞网络编程WSARecvFrom调用失败
VC WSA 异步非阻塞网络编程WSARecvFrom调用失败;下面是主要代码,发送是成功的,但是接受的时候总是不成功,接受到的数据为空,
- C/C++ code
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}[解决办法]
DWORD dwFlag = 0;
[解决办法]
- C/C++ code
DWORD dwRead;DWORD dwFlag;SOCKADDR_IN addrFrom;
------解决方案--------------------
检测WSARecvFrom函数的返回值是什么?WSAGetLastError的值是什么?
[解决办法]
dwFlag是 __in_out ,你没初始化。