首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

VC WSA 异步非阻塞网络编程WSARecvFrom调用失败,该怎么解决

2012-04-16 
VC WSA 异步非阻塞网络编程WSARecvFrom调用失败VC WSA 异步非阻塞网络编程WSARecvFrom调用失败;下面是主要

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 ,你没初始化。

热点排行