以前我都是通过socket直接发送数据包,很少有发送结构体的时候,
都是直接把时间做成字符串,然后发送字符串。
CString m_Millisecond;
COleDateTime m_strDate;
COleDateTime m_strTime;
SYSTEMTIME *curDateTime=new SYSTEMTIME;
::GetLocalTime(curDateTime);
DWORD millisecond=curDateTime->wMilliseconds; //毫秒
delete curDateTime;
m_Millisecond.Format("%d",millisecond);
m_strDate=COleDateTime::GetCurrentTime() ;
CString time1=m_strDate.Format(VAR_DATEVALUEONLY); //获取服务器系统的日期
m_strTime=COleDateTime::GetCurrentTime() ;
CString time2=m_strTime.Format(VAR_TIMEVALUEONLY); //获取时间
CString strMsgData;
strMsgData=time1; //日期
end=sendSo.Send(strMsgData,strMsgData.GetLength());
strMsgData=time2; //时间
end=sendSo.Send(strMsgData,strMsgData.GetLength());
strMsgData=m_Millisecond; //毫秒
end=sendSo.Send(strMsgData,strMsgData.GetLength());
而且还都是TCP协议的,但是后来考虑到教室系统,如果TCP逐个向所有校时终端去发送数据包的话,会有延迟
所以考虑校时服务器采用UDP广播时间来做,所有终端去接收这个广播,就算UDP会有丢包,但是一般没有想象的那么糟,偶尔丢失一两个数据包,主要终端把这个丢失数据的包抛出就可以了,反正服务器实时不停的去广播。
这个时候考虑发送结构体,不去像上面做的那么麻烦的处理.
而且好像一般发送socket数据都是发送的是结构体,自己去写这个结构体里面的头、数据的长度、数据、校验等信息。(听说)而我以前一直以为头和校验 都是TCP\UDP协议默认去做的事情,这个我目前也没考虑好,有时间查查资料吧。占且放下,说说发送结构体的问题.
想要直接发送时间结构体是不允许的.必须自己创建一个结构体,然后里面在使用SYSTIME,然后再发送自己创建的这个结构体.例如:
struct ServerNowTime
{
SYSTEMTIME stOld;
}ServerTime;
Sleep(50); //程序休眠
//首先取得目前的本地时间
GetLocalTime (&(ServerTime.stOld)) ;
if( sendto(sock, (char *)(&ServerTime) , sizeof(ServerTime), 0, (sockaddr*)&addrto,nlen) == SOCKET_ERROR )
cout<<WSAGetLastError()<<endl;
接收端也是如此.
其实主要就是第二个参数,是内存的首地址,
sizeof计算结构体的数据大小
下篇解释一下sizeof 和strlen 使用的区别.