网络底层不是很了解。我现在能知道的是,发送方的多次发送数据可能 接受放一次就能接受到。我想知道的是有没有可能  发送发一次的包数据,接受方分两次以上才接受到呢?我想会不会有网络不好的情况会产生这样的结果呢?

解决方案 »

  1.   

    而且这个tcp的和udp是不是还有些不同
      

  2.   

    网络底层不是很了解。我现在能知道的是,发送方的多次发送数据可能 接受放一次就能接受到。我想知道的是有没有可能  发送发一次的包数据,接受方分两次以上才接受到呢?我想会不会有网络不好的情况会产生这样的结果呢?
    _________________________________________________不是网络不好造成的,windows底层就是这么实现的。windows 会根据网卡的情况决定一次发送包大小,如果你一次发送的数据量比这个包小,windows底层会等一小会,看有没有新数据发送,如果有,会组成一个较大的包一起发送,这个会提交网络传输效率,你可以用setsockopt设置不让它等待,只要有数据,直接发送。
    如果你一次发的数据量超过包的大小,windows就会分包发送不过只是系统做的事,你开发中一般不用管它,它接收时就要注意了,不要以为一次接收就能搞定你所有想要的数据。接收端一般会这么写:char buf[MAX_SIZE];
    int readlen,totalread,totallen;
    readlen=totalread=0;
    totallen=///你本次想要的数据量
    while(totalread<totallen)
    {
        readlen=recv(s,buf+totalread,0);
        totalread+=readlen;
    }
      

  3.   

    各位高手,我举个小例子
    我客户段发消息,消息都小于1024个字节, 每个消息最后用一个'\0'
    接速
    那按上面各位高手的叙述是不是可以这么理解, 我接受信息的时候,可以Receive一次(用1024大小的数组)的时候。
    可能当次接受根本找不到'\0'这个字符,因为可能当次接受了很小的量,是不是不能把这些接受的信息当做“片”(整齐的片) ,而应该看成一个用'\0'分割的数据流?
      

  4.   

    与网络不好没什么关系,主要由MTU决定
      

  5.   

    异步也一样,目的就要取到自己想要的数据,你觉得同步和异步在接收数据方面有什么不同?************************************我认为异步接受数据跟同步有很大的不同,因为,如果人家发送1G的数据过来,你如果用recv接受,那表示,很长一段时间,其他所有的客户都不能发送数据了,发送也会被诸塞,
    而异步操作就不一样,他会接受一部分,那么同时可以接受其他客户的数据,这些就是为什么 MSDN里,牛人说的,把recv的内核缓冲区设定为0可以达到提高性能的效果,在某些情况下
      

  6.   

    各位高手,我举个小例子
    我客户段发消息,消息都小于1024个字节, 每个消息最后用一个'\0'
    接速
    那按上面各位高手的叙述是不是可以这么理解, 我接受信息的时候,可以Receive一次(用1024大小的数组)的时候。
    可能当次接受根本找不到'\0'这个字符,因为可能当次接受了很小的量,是不是不能把这些接受的信息当做“片”(整齐的片) ,而应该看成一个用'\0'分割的数据流?————————————————————————————不要根据内容去判断有没有结束,如果发送的是二进制数据怎么办呀?我知道你的意思,你的意思是指接收的数据不是我来决定,而是对方发多少,我就接收多少,应该怎么处理?我是这么处理的:typedef struct _sockbuf
    {
        UINT len;
        char buf[1];
    }sockbuf,*psockbuf;对于发送端:
    psockbuf senddata;
    UINT len=//你要发送数据的大小
    senddata=(psockbuf)malloc(sizeof(sockbuf)+len);
    senddata->len=len;
    memcpy(senddata->buf,"你要发送的数据",len);
    send(s,(char *)senddata,sizeof(sockbuf)+len,0);
    对于接收端:char buf[MAX_SIZE];
    psockbuf recvdata;
    int readlen,totalread,totallen;
    readlen=totalread=0;
    readlen=recv(s,buf,MAX_SIZE,0);
    recvdata=(psockbuf)buf;
    totallen=recvdata->len;
    totalread+=readlen;
    while(totalread<totallen)
    {
        readlen=recv(s,buf+totalread,0);
        totalread+=readlen;
    }
      

  7.   

    我认为异步接受数据跟同步有很大的不同,因为,如果人家发送1G的数据过来,你如果用recv接受,那表示,很长一段时间,其他所有的客户都不能发送数据了,发送也会被诸塞,
    而异步操作就不一样,他会接受一部分,那么同时可以接受其他客户的数据,这些就是为什么 MSDN里,牛人说的,把recv的内核缓冲区设定为0可以达到提高性能的效果,在某些情况下______________________________哈哈,提醒我了,是这样的,但代码差不多,把readlen,totalread,totallen定义为全局的去掉while循环,我就是这么做的。
      

  8.   

    哈哈,提醒我了,是这样的,但代码差不多,把readlen,totalread,totallen定义为全局的去掉while循环,我就是这么做的。***********************你这样做法,我认为还是不现实的,首先,没有哪个稍微大一点的应用程序,会为了这个去设定全局变量,况且在高并发的程序中,采用的都是多线程,很难通过全局变量来同步。
      

  9.   

    wujiabao(JOB) ( ) 我想问一下,你那个程序开发了多长时间呀
      

  10.   

    wujiabao(JOB) ( ) 我想问一下,你那个程序开发了多长时间呀
    _________________________________________其实网络这一块开发时间不长,没多少东东,我在界面花了很多时间,总决得自己做的界面比别人丑一百倍,上不了台面,现在还在发愁呢我就在这个贴里回答我的设计思想:完成列程接收完数据后,把数据复制一份(费内存,但现在我没有想到更好的方法)放到链表中,另一个(多个)线程监视链表中的数据,取出来进行处理如果数据量较多(链表变长),我就会自动创建多个处理线程进行处理,如果链表长度为0,我会关掉一些线程(哈哈,智能线程调度,一般人我不说的)。至于在线状表,我用一个哈希表来维护的,这样最快。
      

  11.   

    wujiabao(JOB) ( ) 信誉:104   我发现,我们好像霸占了别人的帖子。公司给我设计的时间是到 5月10号,所以我还有点时间,讨论细节,当然这也可以帮助你把程序写的更好,你可以联系我 
    msn [email protected]
    skype magicknife.prince
      

  12.   

    呵呵,看了几位的讨论非常受教。其实告诉大家,我是开发.net的, 但对网络编程非常赶兴趣, 自己也买了本经典的windows网络编程再看, 前几天刚把网络编程的中出现的 完成端口的机制 弄清晰,网络编程这一快有很多细节我都是模糊的,很多知识块都来自于网络上一些代码,而且平心而论,.net的一些网络代码质量明显偏低的,所以我才去抠win32版本的网络编程,现在又弄了windows核心编程在看,没办法没这些补充,网络编程里的许多东西看不懂。撒多少分不重要,重要的是把那些模糊的点弄明白,呵呵,以后我会经常来的,在别的板快多赚点分,这些分我都给各位留着哈