为什么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台电脑 就学不成网络编程了吗?求解
[解决办法]