为什么UDP编程中,recefrom会收到重复包的问题

无无无无无无无无 2012-04-11 07:28:24
为什么UDP编程中,recefrom会收到重复包的问题?
在这里,我并没有发送任何的数据,然而服务器端却无端端收到重复的数据,数据为空??很奇怪...下面是核心代码
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"");
}

...全文
419 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jaylee211 2012-12-06
  • 打赏
  • 举报
回复
新手求问题,我有一个CCP文件,是UDP_Recv_P2P,我直接用VC打开,编译,总是说我选择的工程不对,想问一下我改用什么工程呢?
向立天 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
引用 2 楼 的回复:

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……
[/Quote]
用异步通信
消息触发
这样开销就降下来了
IT业余者 2012-04-12
  • 打赏
  • 举报
回复
你们是怎么测试网络程序的 我只有1台电脑 就学不成网络编程了吗?求解
  • 打赏
  • 举报
回复
还真没碰到过
  • 打赏
  • 举报
回复
大家帮帮忙啊,多谢了
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

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, and a specif……
[/Quote]
按理来说,我没有发送数据,是不会收到数据的;我发现,recvfrom会定时重复收到数据,如果要判断0的话,会有很多的开销的
fishion 2012-04-11
  • 打赏
  • 举报
回复
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, and a specific error code can be retrieved by calling WSAGetLastError.

还得判断0的情况

发送端那里,你得判断 strTempA是否被正确写入了
gfgdfgrgrgse 2012-04-11
  • 打赏
  • 举报
回复
返回值是什么?
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧