Bootstrap

Windows C++ Socket 大文件传输

大文件接收

因为演示不方便 所以 我只给出关键代码 其他小东西,读者自己解决,或者私信我。

// recv 的改造 让他可以循环接收 就是为了大数据传输
int MySocketRecv0(int sock, char* buf, int dateSize)
{
	//循环接收
	int numsRecvSoFar = 0;//目前收到的数据
	int numsRemainingToRecv = dateSize;//剩余要收的数据
	printf("enterMySocketRecv0\n");
	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;
		}
		else if ((bytesRead < 0 ) && (ERROR == EAGAIN))
		{
			continue;
		}
		else
		{
			return -1;
		}
	}

}
大文件发送
//send的改造 传输大数据的
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);
		if (bytesSend==numBytesRemainingToSend)
		{
			return 0;
		}
		else if(bytesSend>0)
		{
			numBytesSentSoFar += bytesSend;
			numBytesRemainingToSend -= bytesSend;
			continue;

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