Windows下SOCKET的recv()函数接收的buf无法随时清除问题

昨天遇到一个问题,我使用客户端来接收一个服务器发送的消息进行判断,然后再转发给另一个服务器。在这个过程中需要随时清空已经接收过的服务器数据,但是使用memset只能在recv接收完毕清空,而无法随时清空,

尝试了很多修改代码逻辑的方法来解决问题,但都不行,后来才发现必须要能够随时清空接受到的buf才能解决问题。

因为时间紧迫,没有想到太好的办法,就临时加了一个线程,一个线程用来接收数据,将接收到不合适的数据memset,合适的数据传给另一个线程执行。

这个线程用来判断数据,如果数据不合适就清除。

while (readLen = recv(hSocket, message, 1, 0))
	{
			if (readLen == -1)
				ErrorHandling("读取失败");
			printf("%s\n", message);
			if (&message == '0')
			{
				
			}
			else if(message[0] == '1')
			{
			
			
			}
			memset(message, 0, strlen(message));
	}

 另一个线程用来检测数据接收情况,发送给另外一个服务器。

这样是把问题解决了,但是还是没有搞清楚recv()接收的原理,经过多次测试才发现,memset清空的只是recv( _In_ SOCKET s, _Out_ char *buf, _In_ int len, _In_ int flags)中buf的缓存。

查阅资料得知:缓冲区有两种。第一种是用户定义的缓冲区,就是recv里的缓冲区参数。另一种就是套接字缓冲区,是由协议自定的。可以用getsockopt获取其大小,并用setsockopt重置其大小。发送的时候使用send实际上是从用户缓冲区发送到socket缓冲区中,至于数据真正何时发送给另一端则是由协议规定的。Recv也类似。

所以每次清空都是无效的。只能读出之后再处理。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
send函数recv函数是VC++中Socket编程中最常用的两个函数,它们分别用于发送数据和接收数据。 send函数的原型如下: ```c++ int send( SOCKET s, const char* buf, int len, int flags ); ``` 参数说明: - s:需要发送数据的Socket。 - buf:指向包含要发送数据的缓冲区的指针。 - len:要发送的数据的字节数。 - flags:调用方式标志。 返回值说明: - 成功:返回实际发送的字节数。 - 失败:返回SOCKET_ERROR。 recv函数的原型如下: ```c++ int recv( SOCKET s, char* buf, int len, int flags ); ``` 参数说明: - s:需要接收数据的Socket。 - buf:指向接收数据的缓冲区的指针。 - len:要接收的数据的最大字节数。 - flags:调用方式标志。 返回值说明: - 成功:返回实际接收的字节数。 - 失败:返回SOCKET_ERROR。 send和recv函数的使用方法如下: ```c++ char sendbuf[] = "Hello, world!"; int sendbuflen = sizeof(sendbuf); int sentbytes = 0; sentbytes = send(sock, sendbuf, sendbuflen, 0); if (sentbytes == SOCKET_ERROR) { // 发送失败 } char recvbuf[1024]; int recvbuflen = sizeof(recvbuf); int receivedbytes = 0; receivedbytes = recv(sock, recvbuf, recvbuflen, 0); if (receivedbytes == SOCKET_ERROR) { // 接收失败 } ``` 使用send和recv函数时需要注意以下几点: - send和recv函数都是阻塞式的,即程序会一直等待直到发送或接收完所有数据。 - 如果发送或接收的数据量比较大,需要多次调用send或recv函数。 - 如果发送或接收的数据量比较小,建议使用TCP_NODELAY选项关闭Nagle算法,以提高发送和接收的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值