当前位置:首页 » 文件管理 » csocket缓存

csocket缓存

发布时间: 2022-08-30 20:49:50

⑴ Socket接收数据怎么清空缓存

通过Socket 发送接收消息遇到个问题C# code
Socket newSocket = socket.Accept();
newSocket.Receive(messages);
获取消息没问题 但是总有缓存区无法清空的问题
比如说我先发一句: 我是中国人
服务端能正确接收到这句消息: 我是中国人
这边再发送一个字: 你
理想状态下服务端应该显示一个字: 你
但是实际上由于缓存区尚未清空的缘故变成了: 你是中国人
只有当消息长度大于缓存区消息时旧消息才能被完全覆盖: 我不是中国人
服务端这时能正确的显示: 我不是中国人
=========================================================
发送消息这边我测试了下 发送出去的消息本身没有问题C# code
socket.Send(byteMessage);
socket.Shutdown(SocketShutdown.Both);
socket.Close();
但是到了接收方收到消息就出问题了。我想应该是缓冲区问题 望各位大大解惑
------解决方案--------------------------------------------------------
这是你数组的问题 跟Socket 缓冲没关系

⑵ 如何清除掉socket发送缓存区中的数据

清空socket缓存区的数据的方法
由于socket是以数据流的形式发送数据,接收方不知道对方一次性发送了多少数据,也能保证对方一次性发送的数据能在同一刻接收到,所以Receive方法是这么工作的:
接受一个byye[]类型的参数作为缓冲区,在经过一定的时间后把接收到的数据填充到这个缓冲区里面,并且返回实际接收到数据的长度,这个实际接收到的数据长度有可能为0(没有接收到数据)、大于0小于缓冲区的长度(接收到数据,但是没有我们预期的多)、等于缓冲区的长度(说明接收到的数据大于等于我们预期的长度)。
每次接收缓冲区都用同一个byte[] byteMessage,并且你没有检查接收到的数据长度,所以第一次你接收到的数据是123456,第二次你只接收到了8,但是缓冲区里面还有23456,所以加起来就是823456了。
socket接收缓冲区的大小有讲究,设置大了接收起来慢,因为它要等尽可能多的数据接收到了再返回;设置小了需要重复多次调用接收方法才能把数据接收完,socket有个属性,标识了系统默认的接收缓冲区大小,可以参考这个!
还有就是用recv读取,但是由于不知道缓存里有多少数据,如果是阻塞模式,到最后必然等到超时才知道数据已经读取完毕,这是个问题。
另一个是用fgetc,通过返回判断是否是feof:
whlie (1) { a=fgetc(f);if (feof(f)) break;//…
b=fgetc(f);if (feof(f)) break;//…}当然,我不知道读取完毕后最后一次调用fgetc会不会堵塞,需要测试。
在非阻塞模式下,我们用recv就可以轻松搞定了,但是阻塞模式下,由于我们不知道缓冲区有多少数据,不能直接调用recv尝试清除。
使用一个小小的技巧,利用select函数,我们可以轻松搞定这个问题:
select函数用于监视一个文件描述符集合,如果集合中的描述符没有变化,则一直阻塞在这里,直到超时时间到达;在超时时间内,一旦某个描述符触发了你所关心的事件,select立即返回,通过检索文件描述符集合处理相应事件;select函数出错则返回小于零的值,如果有事件触发,则返回触发事件的描述符个数;如果超时,返回0,即没有数据可读。
重点在于:我们可以用select的超时特性,将超时时间设置为0,通过检测select的返回值,就可以判断缓冲是否被清空。通过这个技巧,使一个阻塞的socket成了‘非阻塞’socket.
现在就可以得出解决方案了:使用select函数来监视要清空的socket描述符,并把超时时间设置为0,每次读取一个字节然后丢弃(或者按照业务需要进行处理,随你便了),一旦select返回0,说明缓冲区没数据了(“超时”了)。
struct timeval tmOut;tmOut.tv_sec = 0;tmOut.tv_usec = 0;fd_set fds;FD_ZEROS(&fds);FD_SET(skt, &fds);
int nRet;
char tmp[2];
memset(tmp, 0, sizeof(tmp));
while(1)
{ nRet= select(FD_SETSIZE, &fds, NULL, NULL, &tmOut);if(nRet== 0) break;recv(skt, tmp, 1,0);}
这种方式的好处是,不再需要用recv、recvfrom等阻塞函数直接去读取,而是使用select,利用其超时特性检测缓冲区是否为空来判断是否有数据,有数据时才调用recv进行清除。
有人说同样可以用recv和超时设置去清空啊,这个没错,但是你需要直接对socket描述符设置超时时间,而为了清空数据而直接修改socket描述符的属性,可能会影响到其他地方的使用,造成系统奇奇怪怪的问题,所以,不推荐使用。socket的

⑶ 如何清空Socket缓冲区

清空socket缓存区的数据的方法

  • 由于socket是以数据流的形式发送数据,接收方不知道对方一次性发送了多少数据,也能保证对方一次性发送的数据能在同一刻接收到,所以Receive方法是这么工作的:

  • 接受一个byye[]类型的参数作为缓冲区,在经过一定的时间后把接收到的数据填充到这个缓冲区里面,并且返回实际接收到数据的长度,这个实际接收到的数据长度有可能为0(没有接收到数据)、大于0小于缓冲区的长度(接收到数据,但是没有我们预期的多)、等于缓冲区的长度(说明接收到的数据大于等于我们预期的长度)。

  • 每次接收缓冲区都用同一个byte[] byteMessage,并且你没有检查接收到的数据长度,所以第一次你接收到的数据是123456,第二次你只接收到了8,但是缓冲区里面还有23456,所以加起来就是823456了。

  • socket接收缓冲区的大小有讲究,设置大了接收起来慢,因为它要等尽可能多的数据接收到了再返回;设置小了需要重复多次调用接收方法才能把数据接收完,socket有个属性,标识了系统默认的接收缓冲区大小,可以参考这个!

  • 还有就是用recv读取,但是由于不知道缓存里有多少数据,如果是阻塞模式,到最后必然等到超时才知道数据已经读取完毕,这是个问题。

  • 另一个是用fgetc,通过返回判断是否是feof:

  • whlie (1) { a=fgetc(f);if (feof(f)) break;//…

  • b=fgetc(f);if (feof(f)) break;//…}当然,我不知道读取完毕后最后一次调用fgetc会不会堵塞,需要测试。

  • 在非阻塞模式下,我们用recv就可以轻松搞定了,但是阻塞模式下,由于我们不知道缓冲区有多少数据,不能直接调用recv尝试清除。

  • 使用一个小小的技巧,利用select函数,我们可以轻松搞定这个问题:

  • select函数用于监视一个文件描述符集合,如果集合中的描述符没有变化,则一直阻塞在这里,直到超时时间到达;在超时时间内,一旦某个描述符触发了你所关心的事件,select立即返回,通过检索文件描述符集合处理相应事件;select函数出错则返回小于零的值,如果有事件触发,则返回触发事件的描述符个数;如果超时,返回0,即没有数据可读。

  • 重点在于:我们可以用select的超时特性,将超时时间设置为0,通过检测select的返回值,就可以判断缓冲是否被清空。通过这个技巧,使一个阻塞的socket成了‘非阻塞’socket.

  • 现在就可以得出解决方案了:使用select函数来监视要清空的socket描述符,并把超时时间设置为0,每次读取一个字节然后丢弃(或者按照业务需要进行处理,随你便了),一旦select返回0,说明缓冲区没数据了(“超时”了)。

  • struct timeval tmOut;tmOut.tv_sec = 0;tmOut.tv_usec = 0;fd_set fds;FD_ZEROS(&fds);FD_SET(skt, &fds);

  • int nRet;

  • char tmp[2];

  • memset(tmp, 0, sizeof(tmp));

  • while(1)

  • { nRet= select(FD_SETSIZE, &fds, NULL, NULL, &tmOut);if(nRet== 0) break;recv(skt, tmp, 1,0);}

  • 这种方式的好处是,不再需要用recv、recvfrom等阻塞函数直接去读取,而是使用select,利用其超时特性检测缓冲区是否为空来判断是否有数据,有数据时才调用recv进行清除。

  • 有人说同样可以用recv和超时设置去清空啊,这个没错,但是你需要直接对socket描述符设置超时时间,而为了清空数据而直接修改socket描述符的属性,可能会影响到其他地方的使用,造成系统奇奇怪怪的问题,所以,不推荐使用。socket的

linux 怎么判断socket接受缓存满了

/* Net check Make sure you have not used OUT OF BAND DATA AND YOU CAN use OOB */int netcheck(int fd) { int buf_size = 1024; char buf[buf_size]; //clear OOB DATA recv(fd, buf, buf_size); if(send(fd, (void *)"\0", 1, MSG_OOB) < 0 ) { fprintf(stderr, "Connection[%d] send OOB failed, %s", fd, strerror(errno)); return -1; } return 0;}/* Net check Make sure you have not used OUT OF BAND DATA AND YOU CAN use OOB */int netcheck(int fd) { int buf_size = 1024; char buf[buf_size]; //clear OOB DATA recv(fd, buf, buf_size); if(send(fd, (void *)"\0", 1, MSG_OOB) < 0 ) { fprintf(stderr, "Connection[%d] send OOB failed, %s", fd, strerror(errno)); return -1; } return 0;}

⑸ 怎么清空socket 接收缓存区

清空socket缓存区的数据的方法
由于socket是以数据流的形式发送数据,接收方不知道对方一次性发送了多少数据,也能保证对方一次性发送的数据能在同一刻接收到,所以Receive方法是这么工作的:
接受一个byye[]类型的参数作为缓冲区,在经过一定的时间后把接收到的数据填充到这个缓冲区里面,并且返回实际接收到数据的长度,这个实际接收到的数据长度有可能为0(没有接收到数据)、大于0小于缓冲区的长度(接收到数据,但是没有我们预期的多)、等于缓冲区的长度(说明接收到的数据大于等于我们预期的长度)。
每次接收缓冲区都用同一个byte[] byteMessage,并且你没有检查接收到的数据长度,所以第一次你接收到的数据是123456,第二次你只接收到了8,但是缓冲区里面还有23456,所以加起来就是823456了。
socket接收缓冲区的大小有讲究,设置大了接收起来慢,因为它要等尽可能多的数据接收到了再返回;设置小了需要重复多次调用接收方法才能把数据接收完,socket有个属性,标识了系统默认的接收缓冲区大小,可以参考这个!
还有就是用recv读取,但是由于不知道缓存里有多少数据,如果是阻塞模式,到最后必然等到超时才知道数据已经读取完毕,这是个问题。
另一个是用fgetc,通过返回判断是否是feof:
whlie (1) { a=fgetc(f);if (feof(f)) break;//…
b=fgetc(f);if (feof(f)) break;//…}当然,我不知道读取完毕后最后一次调用fgetc会不会堵塞,需要测试。

⑹ 如何得知socket的缓存大小,这个缓存是否有上限,是否会溢出

一:如何得知socket的缓冲大小?
通过socket选项可以获得socket的缓冲大小。(以下是python代码,sock为socket对象)
sock.getsockopt(SOL_SOCKET,SO_RCVBUF):获取接收缓冲区的大小
sock.getsockopt(SOL_SOCKET,SO_SNDBUF):获得发送缓冲区的大小
注:UDP协议在内核实现中没有发送缓冲区。

二:这个缓冲是否有上限?
缓冲区存在上限,没一个socket对象的缓冲区有上限,系统中所有的socket缓冲区的总大小也存在上限。

三:是否会溢出?
TCP协议是可靠的有序的字节流协议,其可靠性与接收端的滑动窗口机制有关,而滑动窗口和TCP的接收缓冲区有关。
TCP协议的缓冲区不会溢出,如果接收缓冲区已满,则通告窗口为0,不能在接收发送端发过来的数据。如果发送缓冲区已满(则可以说明对端的接收缓冲区一定已满),应用层的send调用阻塞(采用阻塞式IO)。所以说TCP协议的缓冲区不会溢出。
UDP协议的缓冲区会溢出,UDP协议在实现上没有发送缓冲区,接收缓冲区存在上限,当UDP的接收缓冲区达到上限时,以后接收到的数据报直接丢弃,这也是UDP协议不可靠的一个原因。
-----------------------------------------------------------------------------------------------------------
推荐你看一下陶辉的”高性能网络编程“系列,肯定会受益匪浅。

⑺ 如何得知socket的缓存大小,这个缓存是否有

清空socket缓存区的数据的方法


  • 由于socket是以数据流的形式发送数据,接收方不知道对方一次性发送了多少数据,也能保证对方一次性发送的数据能在同一刻接收到,所以Receive方法是这么工作的:

  • 接受一个be[]类型的参数作为缓冲区,在经过一定的时间后把接收到的数据填充到这个缓冲区里面,并且返回实际接收到数据的长度,这个实际接收到的数据长度有可能为0(没有接收到数据)、大于0小于缓冲区的长度(接收到数据,但是没有我们预期的多)、等于缓冲区的长度(说明接收到的数据大于等于我们预期的长度)。

  • 每次接收缓冲区都用同一个byte[] byteMessage,并且你没有检查接收到的数据长度,所以第一次你接收到的数据是123456,第二次你只接收到了8,但是缓冲区里面还有23456,所以加起来就是823456了。

  • socket接收缓冲区的大小有讲究,设置大了接收起来慢,因为它要等尽可能多的数据接收到了再返回;设置小了需要重复多次调用接收方法才能把数据接收完,socket有个属性,标识了系统默认的接收缓冲区大小,可以参考这个!

  • 还有就是用recv读取,但是由于不知道缓存里有多少数据,如果是阻塞模式,到最后必然等到超时才知道数据已经读取完毕,这是个问题。

  • 另一个是用fgetc,通过返回判断是否是feof:

  • whlie (1) { a=fgetc(f);if (feof(f)) break;//…

  • b=fgetc(f);if (feof(f)) break;//…}当然,我不知道读取完毕后最后一次调用fgetc会不会堵塞,需要测试。

  • 在非阻塞模式下,我们用recv就可以轻松搞定了,但是阻塞模式下,由于我们不知道缓冲区有多少数据,不能直接调用recv尝试清除。

  • 使用一个小小的技巧,利用select函数,我们可以轻松搞定这个问题:

  • select函数用于监视一个文件描述符集合,如果集合中的描述符没有变化,则一直阻塞在这里,直到超时时间到达;在超时时间内,一旦某个描述符触发了你所关心的事件,select立即返回,通过检索文件描述符集合处理相应事件;select函数出错则返回小于零的值,如果有事件触发,则返回触发事件的描述符个数;如果超时,返回0,即没有数据可读。

  • 重点在于:我们可以用select的超时特性,将超时时间设置为0,通过检测select的返回值,就可以判断缓冲是否被清空。通过这个技巧,使一个阻塞的socket成了‘非阻塞’socket.

  • 现在就可以得出解决方案了:使用select函数来监视要清空的socket描述符,并把超时时间设置为0,每次读取一个字节然后丢弃(或者按照业务需要进行处理,随你便了),一旦select返回0,说明缓冲区没数据了(逗超时地了)。

  • struct timeval tmOut;tmOut.tv_sec = 0;tmOut.tv_usec = 0;fd_set fds;FD_ZEROS(&fds);FD_SET(skt, &fds);

  • int nRet;

  • char tmp[2];

  • memset(tmp, 0, sizeof(tmp));

  • while(1)

  • { nRet= select(FD_SETSIZE, &fds, NULL, NULL, &tmOut);if(nRet== 0) break;recv(skt, tmp, 1,0);}

  • 这种方式的好处是,不再需要用recv、recvfrom等阻塞函数直接去读取,而是使用select,利用其超时特性检测缓冲区是否为空来判断是否有数据,有数据时才调用recv进行清除。

  • 有人说同样可以用recv和超时设置去清空啊,这个没错,但是你需要直接对socket描述符设置超时时间,而为了清空数据而直接修改socket描述符的属性,可能会影响到其他地方的使用,造成系统奇奇怪怪的问题,所以,不推荐使用。socket的

⑻ 使用了 socket 的 dns 缓存,为什么速度还变慢了

建议你按以下方式处理
①关闭所有的防火墙和杀毒软件,包括控制面板里的WINDOWS防火墙,然后传文件试试;
②QQ登陆的时候在设置里选择UDP登陆,或者TCP登陆,看看是否是这方面的原因;
③在设备管理器的“网络适配器里”,找到你的网卡,在属性设置窗口切换到“高级”标签,将“Duplex Mode”或“Link Speed”设置为“Full Mode”
③在本地连接的属性里设置TCP/IP属性,手动设置一个内网IP,如192.168.1.1,子网掩码255.255.255.0,默认网关192.168.1.1,DNS选择一个到两个你所在省常用DNS地址
⑤换个人试试传送速度,传文件慢有可能是对方的原因;或者换个时间段再传,网络有时候是不稳定的

热点内容
linux内核有多少行代码 发布:2024-10-12 23:30:03 浏览:229
qq源码资源网 发布:2024-10-12 23:23:52 浏览:19
为什么web服务器没有对应的站点 发布:2024-10-12 22:55:46 浏览:780
安卓手机在哪里下游戏 发布:2024-10-12 22:54:08 浏览:406
财年算法问题 发布:2024-10-12 22:51:50 浏览:314
sql最近的 发布:2024-10-12 22:51:38 浏览:335
linuxsort命令 发布:2024-10-12 22:32:58 浏览:919
德州电气自动化软件编译 发布:2024-10-12 22:18:14 浏览:853
win7系统怎么清理ftp 发布:2024-10-12 22:08:17 浏览:873
linux查看所有目录 发布:2024-10-12 22:07:05 浏览:16