客户一次发送的数据,在服务器端有可能两次才接受完毕么? 网络底层不是很了解。我现在能知道的是,发送方的多次发送数据可能 接受放一次就能接受到。我想知道的是有没有可能 发送发一次的包数据,接受方分两次以上才接受到呢?我想会不会有网络不好的情况会产生这样的结果呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 而且这个tcp的和udp是不是还有些不同 网络底层不是很了解。我现在能知道的是,发送方的多次发送数据可能 接受放一次就能接受到。我想知道的是有没有可能 发送发一次的包数据,接受方分两次以上才接受到呢?我想会不会有网络不好的情况会产生这样的结果呢?_________________________________________________不是网络不好造成的,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;} 各位高手,我举个小例子我客户段发消息,消息都小于1024个字节, 每个消息最后用一个'\0'接速那按上面各位高手的叙述是不是可以这么理解, 我接受信息的时候,可以Receive一次(用1024大小的数组)的时候。可能当次接受根本找不到'\0'这个字符,因为可能当次接受了很小的量,是不是不能把这些接受的信息当做“片”(整齐的片) ,而应该看成一个用'\0'分割的数据流? 与网络不好没什么关系,主要由MTU决定 异步也一样,目的就要取到自己想要的数据,你觉得同步和异步在接收数据方面有什么不同?************************************我认为异步接受数据跟同步有很大的不同,因为,如果人家发送1G的数据过来,你如果用recv接受,那表示,很长一段时间,其他所有的客户都不能发送数据了,发送也会被诸塞,而异步操作就不一样,他会接受一部分,那么同时可以接受其他客户的数据,这些就是为什么 MSDN里,牛人说的,把recv的内核缓冲区设定为0可以达到提高性能的效果,在某些情况下 各位高手,我举个小例子我客户段发消息,消息都小于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;} 我认为异步接受数据跟同步有很大的不同,因为,如果人家发送1G的数据过来,你如果用recv接受,那表示,很长一段时间,其他所有的客户都不能发送数据了,发送也会被诸塞,而异步操作就不一样,他会接受一部分,那么同时可以接受其他客户的数据,这些就是为什么 MSDN里,牛人说的,把recv的内核缓冲区设定为0可以达到提高性能的效果,在某些情况下______________________________哈哈,提醒我了,是这样的,但代码差不多,把readlen,totalread,totallen定义为全局的去掉while循环,我就是这么做的。 哈哈,提醒我了,是这样的,但代码差不多,把readlen,totalread,totallen定义为全局的去掉while循环,我就是这么做的。***********************你这样做法,我认为还是不现实的,首先,没有哪个稍微大一点的应用程序,会为了这个去设定全局变量,况且在高并发的程序中,采用的都是多线程,很难通过全局变量来同步。 wujiabao(JOB) ( ) 我想问一下,你那个程序开发了多长时间呀 wujiabao(JOB) ( ) 我想问一下,你那个程序开发了多长时间呀_________________________________________其实网络这一块开发时间不长,没多少东东,我在界面花了很多时间,总决得自己做的界面比别人丑一百倍,上不了台面,现在还在发愁呢我就在这个贴里回答我的设计思想:完成列程接收完数据后,把数据复制一份(费内存,但现在我没有想到更好的方法)放到链表中,另一个(多个)线程监视链表中的数据,取出来进行处理如果数据量较多(链表变长),我就会自动创建多个处理线程进行处理,如果链表长度为0,我会关掉一些线程(哈哈,智能线程调度,一般人我不说的)。至于在线状表,我用一个哈希表来维护的,这样最快。 wujiabao(JOB) ( ) 信誉:104 我发现,我们好像霸占了别人的帖子。公司给我设计的时间是到 5月10号,所以我还有点时间,讨论细节,当然这也可以帮助你把程序写的更好,你可以联系我 msn [email protected]skype magicknife.prince 呵呵,看了几位的讨论非常受教。其实告诉大家,我是开发.net的, 但对网络编程非常赶兴趣, 自己也买了本经典的windows网络编程再看, 前几天刚把网络编程的中出现的 完成端口的机制 弄清晰,网络编程这一快有很多细节我都是模糊的,很多知识块都来自于网络上一些代码,而且平心而论,.net的一些网络代码质量明显偏低的,所以我才去抠win32版本的网络编程,现在又弄了windows核心编程在看,没办法没这些补充,网络编程里的许多东西看不懂。撒多少分不重要,重要的是把那些模糊的点弄明白,呵呵,以后我会经常来的,在别的板快多赚点分,这些分我都给各位留着哈 Windows下如何判断计算机能否连接互联网? 关于单文档视图分割 关于接口的东东 两个客户端启动后,发现第一个客户端发送的数据不能到达服务器端? 高分求解 共享内存问题 (vista) 求助,WIN32编程中给对话框贴背景图的问题 请教:图象处理的二阶或高阶线性插值问题 ★★★★★怎样处理这个警告(在线等待,绝对100分满分相送)★★★★★ 分不多了!请教 让静态文本框 自适应窗口的变化,始终居中?? 为什么我这几天一看或者一写程序就头痛(是真的痛),有没有人和我一样的感受过? Edit控件保存上次文字问题? VC对话框怎么显示word文档
_________________________________________________不是网络不好造成的,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;
}
我客户段发消息,消息都小于1024个字节, 每个消息最后用一个'\0'
接速
那按上面各位高手的叙述是不是可以这么理解, 我接受信息的时候,可以Receive一次(用1024大小的数组)的时候。
可能当次接受根本找不到'\0'这个字符,因为可能当次接受了很小的量,是不是不能把这些接受的信息当做“片”(整齐的片) ,而应该看成一个用'\0'分割的数据流?
而异步操作就不一样,他会接受一部分,那么同时可以接受其他客户的数据,这些就是为什么 MSDN里,牛人说的,把recv的内核缓冲区设定为0可以达到提高性能的效果,在某些情况下
我客户段发消息,消息都小于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;
}
而异步操作就不一样,他会接受一部分,那么同时可以接受其他客户的数据,这些就是为什么 MSDN里,牛人说的,把recv的内核缓冲区设定为0可以达到提高性能的效果,在某些情况下______________________________哈哈,提醒我了,是这样的,但代码差不多,把readlen,totalread,totallen定义为全局的去掉while循环,我就是这么做的。
_________________________________________其实网络这一块开发时间不长,没多少东东,我在界面花了很多时间,总决得自己做的界面比别人丑一百倍,上不了台面,现在还在发愁呢我就在这个贴里回答我的设计思想:完成列程接收完数据后,把数据复制一份(费内存,但现在我没有想到更好的方法)放到链表中,另一个(多个)线程监视链表中的数据,取出来进行处理如果数据量较多(链表变长),我就会自动创建多个处理线程进行处理,如果链表长度为0,我会关掉一些线程(哈哈,智能线程调度,一般人我不说的)。至于在线状表,我用一个哈希表来维护的,这样最快。
msn [email protected]
skype magicknife.prince