帮忙看看就几条语句,有啥问题?

dl_zzc 2018-12-05 03:07:24
USES_CONVERSION;
LPCTSTR pszHostAddress = (LPCTSTR)Sntp_IP;
LPSTR lpszAscii = T2A((LPTSTR)pszHostAddress);
addrSrv.sin_addr.S_un.S_addr=inet_addr(lpszAscii);*/

感觉内存泄露很严重!哪里的问题呢?请指教。
...全文
216 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dl_zzc 2018-12-06
  • 打赏
  • 举报
回复
引用 2 楼 91program 的回复:
过段时间似乎就不能对时间了,先分析一下失败在哪里?
可能与内存泄露相关哦!

另外,my_localtime 是个什么东东?它返回的空间是怎么来的?


EVC 不支持localtime函数,所以,做了一个替代:
//将time_t格式的标准时间数据转换为tm格式的本地时间数据
struct tm* my_localtime(const time_t *ptime)
{
//计算从1601-1970的时间偏差(以秒为单位)
static __int64 iOffset;
__int64 iTime;
static struct tm t;
struct tm t2;
FILETIME f;
SYSTEMTIME s;
int TZBiasSecs;
int DSTBiasSecs;

//计算从1601-1970的时间偏差(以秒为单位)
iOffset = GetDeltaSecs(YearToFileTime(1601), YearToFileTime(1970));

memset(&t, 0, sizeof(struct tm));
//获取时区偏差数据
GetTZBias(&TZBiasSecs, &DSTBiasSecs);

//转换为64位整形格式的时间数据(从1601.1.1起至当前时间的秒数)
iTime = ((__int64)*ptime + iOffset - (__int64)TZBiasSecs) * n1SecIn100NS;

//将64位整形格式的时间数据转换为FILETIME格式时间数据
f = Int64ToFileTime(iTime);

// 将时间数据从FILETIME格式转换为tm格式
if(FileTimeToSystemTime(&f, &s))
{
t2 = SystemTimeToTm(s);
if(isindst(&t2))
{
//加入夏令时制偏差
f = Int64ToFileTime(iTime - DSTBiasSecs * n1SecIn100NS);
FileTimeToSystemTime(&f, &s);
}
t = SystemTimeToTm(s);
}

return &t;
}
dl_zzc 2018-12-06
  • 打赏
  • 举报
回复
引用 4 楼 dl_zzc 的回复:
是不是死锁了?

死锁的话怎么解决呀?
似乎EVC编译不过去。
struct timeval tv_out;

tv_out.tv_sec = 1;//等待1秒
tv_out.tv_usec = 0;
setsockopt(soc,SOL_SOCKET,SO_RCVTIMEO,&tv_out, sizeof(tv_out));
dl_zzc 2018-12-06
  • 打赏
  • 举报
回复
是不是死锁了?
91program 2018-12-05
  • 打赏
  • 举报
回复
过段时间似乎就不能对时间了,先分析一下失败在哪里?
可能与内存泄露相关哦!

另外,my_localtime 是个什么东东?它返回的空间是怎么来的?
dl_zzc 2018-12-05
  • 打赏
  • 举报
回复
UINT SntpTime(LPVOID pParam)
{
while(1)
{
WORD wVersionRequested;
WSADATA wsaData;
// 初始化版本
wVersionRequested = MAKEWORD( 1, 1 );
if (0!=WSAStartup(wVersionRequested, &wsaData))
{
WSACleanup();
continue;
}
if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup( );
continue;
}
// 这个IP是中国大陆时间同步服务器地址,可自行修改
SOCKET soc=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
struct sockaddr_in addrSrv;
/*
USES_CONVERSION;
LPCTSTR pszHostAddress = (LPCTSTR)Sntp_IP;
LPSTR lpszAscii = T2A((LPTSTR)pszHostAddress);
addrSrv.sin_addr.S_un.S_addr=inet_addr(lpszAscii);
*/

addrSrv.sin_addr.S_un.S_addr=inet_addr("172.20.99.102");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(123);
NTP_Packet NTP_Send,NTP_Recv;
NTP_Send.Control_Word = htonl(0x0B000000);
NTP_Send.root_delay = 0;
NTP_Send.root_dispersion = 0;
NTP_Send.reference_identifier = 0;
NTP_Send.reference_timestamp = 0;
NTP_Send.originate_timestamp = 0;
NTP_Send.receive_timestamp = 0;
NTP_Send.transmit_timestamp_seconds = 0;
NTP_Send.transmit_timestamp_fractions = 0;
if(SOCKET_ERROR==sendto(soc,(const char*)&NTP_Send,sizeof(NTP_Send),0,(struct sockaddr*)&addrSrv,sizeof(addrSrv)))
{
closesocket(soc);
continue;
}
int sockaddr_Size =sizeof(addrSrv);
if(SOCKET_ERROR==recvfrom(soc,(char*)&NTP_Recv,sizeof(NTP_Recv),0,(struct sockaddr*)&addrSrv,&sockaddr_Size))
{
closesocket(soc);
continue;
}
closesocket(soc);
WSACleanup();
SYSTEMTIME newtime;
float Splitseconds;
struct tm *lpLocalTime;
time_t ntp_time;
// 获取时间服务器的时间
ntp_time = ntohl(NTP_Recv.transmit_timestamp_seconds)-2208988800; //为1900年1月1日00:00:00~1970年1月1日00:00:00的总秒数
lpLocalTime = my_localtime(&ntp_time);
if(lpLocalTime == NULL)
{
continue;
}
// 获取新的时间
newtime.wYear =lpLocalTime->tm_year+1900;
newtime.wMonth =lpLocalTime->tm_mon+1;
newtime.wDayOfWeek =lpLocalTime->tm_wday;
newtime.wDay =lpLocalTime->tm_mday;
newtime.wHour =lpLocalTime->tm_hour;
newtime.wMinute =lpLocalTime->tm_min;
newtime.wSecond =lpLocalTime->tm_sec;
// 设置时间精度
Splitseconds=(float)ntohl(NTP_Recv.transmit_timestamp_fractions);
Splitseconds=(float)0.000000000200 * Splitseconds;
Splitseconds=(float)1000.0 * Splitseconds;
newtime.wMilliseconds = (unsigned short)Splitseconds;
// 修改本机系统时间
SetLocalTime(&newtime);
Sleep(1000);
}
return 0;
}

这是完整代码,对时用的,开始还挺好,过段时间似乎就不能对时间了。

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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