recv和send函数的优化

文章展示了如何使用recv和send函数来分块传输大型数据。在循环中,每次接收或发送一定量的数据,直到完成所有数据的传输。当遇到EAGAIN错误(资源暂时不可用)时,函数会继续尝试,确保数据完整传输。
摘要由CSDN通过智能技术生成

如果我们要传输大型的消息该怎么做呢

RECV函数

int MySocketRecv0(int sock, char* buf, int dateSize)
{
	int numsRecvSoFar = 0;     /已经接收的数据大小
	int numsRemainingToRecv = dateSize;     /剩余接收的数据大小

datesize表示要接受的数据大小,最开始剩余的大小就是要接收的大小

while (1)
	{
int bytesRead = recv(sock, &buf[numsRecvSoFar], numsRemainingToRecv, 0);
printf("###bytesRead = %d,numsRecvSoFar = %d, numsRemainingToRecv = %d\n",
			bytesRead, numsRecvSoFar, numsRemainingToRecv);
		if (bytesRead == numsRemainingToRecv)
		{
			return 0;
		}
		else if (bytesRead > 0)
		{
			numsRecvSoFar += bytesRead;
			numsRemainingToRecv -= bytesRead;
			continue;
		}

这里的第一个if表示,如果已经接收的数据大小等于剩余接收的大小,就说明接收完毕

第二个if表示,如果已经接收的数据大于0,接收的数据一开始为0,就要加上已接受的数据,剩余接收的数据大小就等于它减去已接收的大小

else if ((bytesRead < 0) && (errno == EAGAIN))
		{
			continue;
		}
		else
		{
			return -1;
		}

SEND函数

和recv函数基本一样

int MySocketSend0(int socketNum, unsigned char* data, unsigned dataSize)
{
	unsigned numBytesSentSoFar = 0;
	unsigned numBytesRemainingToSend = dataSize;
	while (1)
	{
		int bytesSend = send(socketNum, (char const*)(&data[numBytesSentSoFar]),
			numBytesRemainingToSend, 0/*flags*/);
		if (bytesSend == numBytesRemainingToSend)
		{
			return 0;
		}
		else if (bytesSend > 0)
		{
			numBytesSentSoFar += bytesSend;
			numBytesRemainingToSend -= bytesSend;
			continue;
		}
		else if ((bytesSend < 0) && (errno == 11))
		{
			continue;
		}
		else
		{
			return -1;
		}
	}
}

recv函数send函数是在网络编程中常用的函数,分别用于接收和发送数据。下面对这两个函数进行详细解释,并列出参数可选值。 1. recv函数 recv函数用于从socket中接收数据。其函数原型如下: ``` int recv(int sockfd, void *buf, size_t len, int flags); ``` 其中,参数说明如下: - sockfd:指定接收数据的socket文件描述符。 - buf:指向存放接收数据的缓冲区的指针。 - len:指定接收数据的最大长度。 - flags:指定函数调用的选项。 flags可选值如下: - 0:默认情况下,recv函数是阻塞的。如果没有数据可读,函数会一直等待,直到有数据可读或者发生错误才会返回。 - MSG_DONTWAIT:非阻塞模式,如果没有数据可读,函数会立即返回,并且不会等待数据到来。 - MSG_PEEK:接收数据时不将数据从接收缓冲区中删除,下次再调用recv函数时仍然可以读取到这些数据。 2. send函数 send函数用于向socket中发送数据。其函数原型如下: ``` int send(int sockfd, const void *buf, size_t len, int flags); ``` 其中,参数说明如下: - sockfd:指定发送数据的socket文件描述符。 - buf:指向存放发送数据的缓冲区的指针。 - len:指定发送数据的长度。 - flags:指定函数调用的选项。 flags可选值如下: - 0:默认情况下,send函数是阻塞的。如果发送缓冲区已满,函数会一直等待,直到有空间可用或者发生错误才会返回。 - MSG_DONTWAIT:非阻塞模式,如果发送缓冲区已满,函数会立即返回,并且不会等待空间可用。 以上是recv函数send函数的详解及参数可选值。在实际应用中,我们需要根据具体情况选择合适的选项,以达到最佳的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值