读书人

为什么UDP编程中recefrom会收到重复

发布时间: 2012-04-17 15:06:33 作者: rapoo

为什么UDP编程中,recefrom会收到重复包的问题
为什么UDP编程中,recefrom会收到重复包的问题?
在这里,我并没有发送任何的数据,然而服务器端却无端端收到重复的数据,数据为空??很奇怪...下面是核心代码

C/C++ code
BOOL CChatDlg::InitSocket(void){    m_socket = socket(AF_INET,SOCK_DGRAM,0);    if(INVALID_SOCKET == m_socket)    {        ::AfxMessageBox(L"套接字创建失败了");        return FALSE;    }    SOCKADDR_IN addrSock;    addrSock.sin_family = AF_INET;    addrSock.sin_port = htons(5111);    addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);    int retval = bind(m_socket,(SOCKADDR *)&addrSock,sizeof(SOCKADDR));    if(SOCKET_ERROR == retval)    {        ::AfxMessageBox(L"套接字绑定失败了");        closesocket(m_socket);        return FALSE;    }    return true;}BOOL CChatDlg::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: 在此添加额外的初始化代码    InitSocket();    RECVPARAM * pRecvParam = new RECVPARAM();    pRecvParam->hwnd = GetSafeHwnd();    pRecvParam->socket = m_socket;    HANDLE hThread = CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);    CloseHandle(hThread);    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE}LRESULT CChatDlg::OnRevcData(WPARAM wParam,LPARAM lParam){    CString str = (LPSTR)lParam;    //char strTempA[200];    CString strTempW;    this->GetDlgItemTextW(IDC_EDIT_RECV,strTempW);    str += L"\r\n";    str += strTempW;    this->SetDlgItemTextW(IDC_EDIT_RECV,str);    return 1;}DWORD CChatDlg::RecvProc(LPVOID lpParameter){    SOCKET sock = ((RECVPARAM *)lpParameter)->socket;    HWND hwnd = ((RECVPARAM *)lpParameter)->hwnd;    SOCKADDR_IN addrFrom;    int len = sizeof(SOCKADDR);    char recvBuff[200];    char tempBuff[200];    int     retval;    while(TRUE)    {        retval = recvfrom(sock,recvBuff,200,0,(SOCKADDR *)&addrFrom,&len);        if(SOCKET_ERROR == retval)        {            ::AfxMessageBox(L"接收信息失败");            break;        }        sprintf(tempBuff,"%s 说 %s",::inet_ntoa(addrFrom.sin_addr),recvBuff);         ::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuff);    }// while    return 1;}void CChatDlg::OnBnClickedBtnSend(){    // TODO: 在此添加控件通知处理程序代码    DWORD dwIP;    ((CIPAddressCtrl  *)GetDlgItem(IDC_IPADDRESS))->GetAddress(dwIP);    SOCKADDR_IN addrTo;    addrTo.sin_family = AF_INET;    addrTo.sin_port = htons(5111);    addrTo.sin_addr.S_un.S_addr = htonl(dwIP);//转换为网络字节序    CString strSend;    char strTempA[200];    ::memset(strTempA,0,200);    GetDlgItemTextW(IDC_EDIT_SEND,strSend);    ::WideCharToMultiByte(CP_ACP,0,strSend,-1,strTempA,strSend.GetLength(),NULL,NULL);    sendto(m_socket,strTempA,strSend.GetLength()+1,0,(SOCKADDR *)&addrTo,sizeof(SOCKADDR));    SetDlgItemTextW(IDC_EDIT_SEND,L"");}


[解决办法]
还真没碰到过
[解决办法]
你们是怎么测试网络程序的 我只有1台电脑 就学不成网络编程了吗?求解
[解决办法]
探讨
引用:

If no error occurs, recvfrom returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned……


读书人网 >VC/MFC

热点推荐