Socket 发送结构体 系统时间 校时系统

以前我都是通过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 使用的区别.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值