小弟最近做一个测试网络的软件,用的是VC6.0,但是请教下我的发包的大小是用空间控制的,所以大小未知,请问一下,包写成了一个结构。
struct pack
{
DWORD dwSequence;//包的标记
DWORD MTime;//发包的时间,分钟
DWORD STime;//毫秒
bool IsRead;//服务器是否受到,服务器收到包以后就修改里面的值
char FillNum[1];//填充包大小,就是这里如何控制??
}
怎么控制UDP、TCP的包大小,服务器又怎么接收?或者有相关例子,请给予指点。[email protected]这是我的邮箱。还有因为要控制发包的时间,所以采用了多线程设计,一个发送,一个接收,不知道这种情况socket要创建几个?

解决方案 »

  1.   

    >>怎么控制UDP、TCP的包大小,服务器又怎么接收?
    struct   pack  mypack;
    //发送
    mypack.FillNum = data_size; //數據的實際大小
    send(socket,&mypack, ...);
    send(socket,yourdata, ....);//接收
    struct   pack  recvpack;
    recv(socket,&recvpack, ...);
    int nReadByte=recv(socket,buffer, ...);
    int nSum=nReadByte;
    while( nSum < recvpack.FillNum  ){
         nReadByte=recv(socket,buffer, ...);
         nSum+=nReadByte;
      

  2.   

    如果是TCP可以设置send buffer的大小来控制包大小,它不会丢包,但udp包太大可能会丢包
      

  3.   

    to:jsphuang 
       您的代码只写了TCP的,那UDP的呢?
    to:mynamelj 
       我看过一些资料,知道UDP包的大小不能超过1500左右,谢谢您的回答
      

  4.   

    我看过一些资料,知道UDP包的大小不能超过1500左右,谢谢您的回答
    ========================================================================
    书上也应该说过,有些情况下UDP包的大小不能超过500左右吧?呵呵
      

  5.   

    >>您的代码只写了TCP的,那UDP的呢?
    udp就换成recvfrom,sendto
      

  6.   

    除非你自己开发tcp/ip协议栈和网卡驱动,否则根本不能控制数据包的大小即使你把这些都做了,那么在mtu过小的路径上,你经过的路由器还会把你的ip包分片
    所以自己控制数据包的大小是没有意义的。
      

  7.   

    说起包的大小就有点疑惑,今天我就在公司局域网测了一下,用ACE_sock_dramg,send一个包,大小是60*1024,超过64*1024就出错,我以为是他设了SO_SNDBUF,我就查了一下getsockopt,得到这个SO_SNDBUF大小是8192,也没有拆包,合包操作,发一个60*1024大小的包就可以收到一个60*1024大小的包,连续发100个包,乱序与丢包只1%,我用的是ACE,不知winsock是不是也是这样的,请高人解一下............................................................................................................................................................................................
      

  8.   

    to:captain_x 
    我写的这个软件用于测试丢包率的,所以大小必须控制,我知道MTU的问题所以我打算限制出不超过1500,谢谢您的回答。
    to:jsphuang 
    不好意思我没反应过来,但是现在知道你的意思,不好意思,但是拆包就达不到我想要的效果了。谢谢您的回答
      

  9.   

    测丢包率的话是要控制大小,但是根据udp协议,只要不大于mtu应该就没问题
    你用多线程也没有意义,因为你的处理很简单,不会造成负担,应该比网络io要快
    所以单线程就可以了,如果为了界面显示的话可以把测试放到工作线程里去。
      

  10.   

    to:captain_x 
    因为发送的时候会有时间间隔,所以采用了多线程,不然不好收发包,谢谢关注!