为什么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"");
}

...全文
426 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
  • 打赏
  • 举报
回复
返回值是什么?
内容概要:本文围绕【复现IEEE二区文献】基于状态空间表示与组件连接法的构网型逆变器统一小信号建模框架研究,提出了一种适用于多控制策略构网型逆变器的小信号建模方法。该方法结合状态空间建模理论与组件连接法(Component Connection Method),实现了对复杂逆变器系统动态特性的精确描述,尤其适用于分析系统在不同运行工况下的稳定性。通过Matlab代码实现,构建了包含控制环路、滤波器、锁相环等关键模块的完整小信号模型,并利用特征值分析与模态参与度评估系统稳定性,解决了传统建模方法在面对多时间尺度、强耦合非线性控制结构时建模困难、精度不足的问题。研究还探讨了关键控制参数对系统稳定边界的影响,为构网型逆变器的参数整定与优化设计提供了理论依据和技术支撑。; 适合人群:具备电力电子、自动控制理论基础,从事新能源发电、微电网、电力系统稳定性研究的研究生、科研人员及工程技术人员,尤其适合致力于高水平期刊论文复现与仿真实践的科研工作者。; 使用场景及目标:① 掌握构网型逆变器统一小信号建模的核心方法,复现IEEE二区高水平文献成果;② 理解状态空间法与组件连接法在复杂电力电子系统建模中的集成应用;③ 利用Matlab进行特征值分析与稳定性判据研究,支撑科研仿真与论文写作;④ 为多逆变器并联系统、微电网稳定性分析等课题提供建模工具与技术路线参考。; 阅读建议:建议读者结合Matlab代码与文中建模流程逐步调试,重点关注各子模块状态方程的推导与系统整体矩阵组装过程,深入理解控制参数对系统极点分布的影响规律,建议配合其他稳定性分析案例进行对比学习以加深理解。
内容概要:WiFiSupply斯普莱WFS7000XB52AX5G是一款高性能、工业级的5G全网通+双频WIFI6无线AP基站,支持5G与工业大功率Wi-Fi链路无缝切换与带宽聚合,具备高达2974Mbps的双频带宽和1000Mbps以上的实际吞吐量。设备采用MIMO 4T4R架构,支持OFDMA、AI智能FastRoaming等先进技术,实现低至20ms的漫游切换延迟和超远传输距离(点对点桥接可达150公里以上)。产品具备IP68防水、-45~85℃宽温运行、多重看门狗、防浪涌、防静电等工业级防护设计,适用于复杂恶劣环境。支持胖瘦AP模式、多种认证与管理方式(含云平台、API接口),并集成丰富的网络安全与QoS功能,适用于智慧物流、工业4.0、巡检机器人、无人机、车载船舶等多种场景。; 适合人群:从事工业物联网、智能制造、自动化物流、智能交通等领域的网络工程师、系统集成商、设备制造商及技术决策人员。; 使用场景及目标:①实现移动设备(如AGV/AMR/巡检机器人)在高速移动中的零丢包、低延迟无线漫游;②在无固定网络覆盖区域构建高带宽、高可靠的远距离无线通信链路;③为5G与工业Wi-Fi双链路备份与聚合提供一体化解决方案,保障关键业务连续性;④在复杂电磁环境下实现稳定、安全的数据传输与远程控制。; 阅读建议:本产品技术参数详尽,建议结合具体应用场景重点关注其无线性能、漫游技术、供电方式与安装选项,并参考官方提供的管理平台与API接口文档进行系统集成与远程运维规划。

18,356

社区成员

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

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