udp server的sendto是不是用同一个socket完成? 我这样写对吗? 疑惑中...

OK_boom 2017-05-31 03:57:24
模拟一个ntp服务器:

while (!_this->isStoped) {
struct sockaddr lvClientSocketAddr;
int lvsadsize = sizeof(struct sockaddr);
struct ntp_packet lvRec;
int lvBufSize = sizeof(lvRec);
log(L"listen new connect ...");
if (recvfrom(_this->listenSocket, (char*)&lvRec, lvBufSize, 0, (struct sockaddr*)&lvClientSocketAddr, &lvsadsize) == SOCKET_ERROR) {
TCHAR lvBuf[1024];
size_t lvS = 1024 * sizeof(TCHAR);
Utils::SysErrorMessage(GetLastError(), lvBuf, lvS);
log(L"recvfrom failed,%s",lvBuf);
break;
}
lvRec = TimeUtils::ntppacket_ntoh(lvRec);
log(L"new connect comming.");
lvRec = buildResponsePacket();
log(L"send ntp data...");

sendto(_this->listenSocket, (char*)&lvRec, sizeof(ntp_packet), 0, (struct sockaddr*)&lvClientSocketAddr,lvsadsize);

USES_CONVERSION;
log(L"sent to %s OK", A2T(inet_ntoa(((sockaddr_in*)&lvClientSocketAddr)->sin_addr)));
...



sendto这句, 用wireshark捕获不到! 但用自己写的客户端代码的recvfrom是可以成功接收的:

...
if (SOCKET_ERROR == sendto(soc, (const char*)&NTP_Send, sizeof(NTP_Send),
0, (struct sockaddr*)&addrSrv, sizeof(addrSrv)))
{
//closesocket(soc);
//return false;
}
int sockaddr_Size = sizeof(addrSrv);
if (SOCKET_ERROR == recvfrom(soc, (char*)&NTP_Recv, sizeof(NTP_Recv),
0, (struct sockaddr*)&addrSrv, &sockaddr_Size))
{
//closesocket(soc);
//return false;
}
else {
lvOK = true;
break;
}
...


而同样的客户端 代码也能正确接受其他ntp服务器(如time.windows.com)传回来的数据包, 可见client的代码是没问题的.


现在很诡异的是上面部分的服务端代码的sendto发送的数据包虽然client端能收到,但抓包工具抓不到,而且用linux的ntpdate工具和windows的internet时间更新均不能收到这个Server发出来的数据包!!
请问各位大神, 问题出在哪里?
...全文
228 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
danscort2000 2017-06-29
  • 打赏
  • 举报
回复
代码太乱了 while (!_this->isStoped) { struct sockaddr lvClientSocketAddr; int lvsadsize = sizeof(struct sockaddr); struct ntp_packet lvRec; int lvBufSize = sizeof(lvRec); log(L"listen new connect ..."); if (recvfrom(_this->listenSocket, (char*)&lvRec, lvBufSize, 0, (struct sockaddr*)&lvClientSocketAddr, &lvsadsize) == SOCKET_ERROR) { TCHAR lvBuf[1024]; size_t lvS = 1024 * sizeof(TCHAR); Utils::SysErrorMessage(GetLastError(), lvBuf, lvS); log(L"recvfrom failed,%s",lvBuf); break; } 居然在while循环里定义大量的局部变量,你自己能搞清楚哪个是局部变量,那个是外部变量,什么时候消失? 全都放外面去定义去 不要使用 类似 int lvBufSize = sizeof(lvRec); 应该改写成 int lvBufSize =(int) sizeof(struct ntp_packet); 不要使用TCHAR ,实现代码里要么用char , 要么用wchar_t这些都是很基础的 先把自己的代码整理清晰,错误在哪里也就能一眼看出来了

18,356

社区成员

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

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