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

...全文
349 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
  • 打赏
  • 举报
回复
返回值是什么?

18,356

社区成员

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

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