怎样清空套接字的缓冲区?

时间:2021-02-23 11:08:04

while(1)
{
// 接收数据
recv(sockConn, recvBuf, 100, 0);

if(!memcmp(recvBuf,TOA_COMMAND_START,strlen(TOA_COMMAND_START)))
{
printf(...);//打印收到的数据
}
}


结果同一个数据被打印多次了,也就是说recv取数的缓冲区没有更新。我现在要怎样才能清空recv接收数据的缓冲区啊?

18 个解决方案

#1


你程序里用memcmp比较TOA_COMMAND_START和recvBuf,相等则打印,那肯定打印的都是TOA_COMMAND_START,被打印多次也不奇怪啊,何况对方可能真给你发了多个TOA_COMMAND_START

#2


用抓包软件看看是不是同一数据发送了多次了

#3


每次打印完了memset(recvBuf,0,sizeof(recvBuf))

#4


需要判断recv的返回值

#5


引用 3 楼 king_hhuang 的回复:
每次打印完了memset(recvBuf,0,sizeof(recvBuf))

这种方法我试过了,不行啊,设为0后,下次取的话从缓冲区里取的还同样是原来的数据啊,除非缓冲区被刷新了,有新的数据到来。。。

#6


recv这个函数,使用时最好检查返回值。

#7


memset(recvBuf,0,len);
不过在接收过程中无法清空,因为另一半控制实际上在网卡上.

#8


判断一下recv的返回值,看是否有新数据

#9


你是在做同步通信还是异步通信
我觉得不是所谓缓冲区的问题

#10


引用 9 楼 xianglitian 的回复:
你是在做同步通信还是异步通信
我觉得不是所谓缓冲区的问题

向爷,您好,我做的是同步通信。。。呵呵。。。

#11


引用 8 楼 oyljerry 的回复:
判断一下recv的返回值,看是否有新数据

怎么判断啊?
Return Value
If no error occurs, recv returns the number of bytes received and the buffer pointed to by the buf parameter will contain this data received. If the connection has been gracefully closed, the return value is zero.

Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.

recv函数的返回值不能指定有没有新数据到来啊?

#12


引用 8 楼 oyljerry 的回复:
判断一下recv的返回值,看是否有新数据

您说的是判断buf的数据有没有变化时吧?

#13


引用 10 楼 helonsy 的回复:
引用 9 楼 xianglitian 的回复:

你是在做同步通信还是异步通信
我觉得不是所谓缓冲区的问题

向爷,您好,我做的是同步通信。。。呵呵。。。
不要叫我向爷了
听着别扭
呵呵
你多贴些代码出来吧
两边的都贴些
这些代码看不出什么问题
同步通信案例接受时应该阻塞的
你确定连接是正常的么

#14


引用 13 楼 xianglitian 的回复:
引用 10 楼 helonsy 的回复:

引用 9 楼 xianglitian 的回复:

你是在做同步通信还是异步通信
我觉得不是所谓缓冲区的问题

向爷,您好,我做的是同步通信。。。呵呵。。。
不要叫我向爷了
听着别扭
呵呵
你多贴些代码出来吧
两边的都贴些
这些代码看不出什么问题
同步通信案例接受时应该阻塞的
你确定连接是正常的么

那就叫 天哥 吧,呵呵。。。
代码您先等会啊,我先用8楼的方法试试。。。

#15


recv返回值才是表明你真正接收了多少数据,错误是-1,正常结束是0,不然就是你接收的数据大小

#16


recv完成,其内容一定已经被清空了,不存在缓存无法清空问题 

1。 memset之后依然有同样内容被打印,则一定是对方重发了
2。如果没有memset,怀疑recv返回-1,你依然打印上次收到内容 

#17


就算recv返回-1,memset过了的BUF也不会是上次收到的内容啊,估计是重发了,要看其它的代码才能判断。

#18


应该是返回了多次同样的数据,做其他操作的时候,接受的数据是上次缓冲的,这就有问题了

#1


你程序里用memcmp比较TOA_COMMAND_START和recvBuf,相等则打印,那肯定打印的都是TOA_COMMAND_START,被打印多次也不奇怪啊,何况对方可能真给你发了多个TOA_COMMAND_START

#2


用抓包软件看看是不是同一数据发送了多次了

#3


每次打印完了memset(recvBuf,0,sizeof(recvBuf))

#4


需要判断recv的返回值

#5


引用 3 楼 king_hhuang 的回复:
每次打印完了memset(recvBuf,0,sizeof(recvBuf))

这种方法我试过了,不行啊,设为0后,下次取的话从缓冲区里取的还同样是原来的数据啊,除非缓冲区被刷新了,有新的数据到来。。。

#6


recv这个函数,使用时最好检查返回值。

#7


memset(recvBuf,0,len);
不过在接收过程中无法清空,因为另一半控制实际上在网卡上.

#8


判断一下recv的返回值,看是否有新数据

#9


你是在做同步通信还是异步通信
我觉得不是所谓缓冲区的问题

#10


引用 9 楼 xianglitian 的回复:
你是在做同步通信还是异步通信
我觉得不是所谓缓冲区的问题

向爷,您好,我做的是同步通信。。。呵呵。。。

#11


引用 8 楼 oyljerry 的回复:
判断一下recv的返回值,看是否有新数据

怎么判断啊?
Return Value
If no error occurs, recv returns the number of bytes received and the buffer pointed to by the buf parameter will contain this data received. If the connection has been gracefully closed, the return value is zero.

Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.

recv函数的返回值不能指定有没有新数据到来啊?

#12


引用 8 楼 oyljerry 的回复:
判断一下recv的返回值,看是否有新数据

您说的是判断buf的数据有没有变化时吧?

#13


引用 10 楼 helonsy 的回复:
引用 9 楼 xianglitian 的回复:

你是在做同步通信还是异步通信
我觉得不是所谓缓冲区的问题

向爷,您好,我做的是同步通信。。。呵呵。。。
不要叫我向爷了
听着别扭
呵呵
你多贴些代码出来吧
两边的都贴些
这些代码看不出什么问题
同步通信案例接受时应该阻塞的
你确定连接是正常的么

#14


引用 13 楼 xianglitian 的回复:
引用 10 楼 helonsy 的回复:

引用 9 楼 xianglitian 的回复:

你是在做同步通信还是异步通信
我觉得不是所谓缓冲区的问题

向爷,您好,我做的是同步通信。。。呵呵。。。
不要叫我向爷了
听着别扭
呵呵
你多贴些代码出来吧
两边的都贴些
这些代码看不出什么问题
同步通信案例接受时应该阻塞的
你确定连接是正常的么

那就叫 天哥 吧,呵呵。。。
代码您先等会啊,我先用8楼的方法试试。。。

#15


recv返回值才是表明你真正接收了多少数据,错误是-1,正常结束是0,不然就是你接收的数据大小

#16


recv完成,其内容一定已经被清空了,不存在缓存无法清空问题 

1。 memset之后依然有同样内容被打印,则一定是对方重发了
2。如果没有memset,怀疑recv返回-1,你依然打印上次收到内容 

#17


就算recv返回-1,memset过了的BUF也不会是上次收到的内容啊,估计是重发了,要看其它的代码才能判断。

#18


应该是返回了多次同样的数据,做其他操作的时候,接受的数据是上次缓冲的,这就有问题了