send和recv:用于超大数据传输的写法

1、两个主要函数

int MySocketRecv0(int sock, char* buf, int dateSize)
{
//循环接收
int numsRecvSoFar = 0;
int numsRemainingToRecv = dateSize;
printf("enter MySocketRecv0\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) && (errno == EAGAIN))
{
continue;
}
else
{
return -1;
}
}
}


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;
}
}
}

2、服务端

#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>

#pragma comment(lib,"ws2_32.lib") 

int MySocketRecv0(int sock, char* buf, int dateSize);
int MySocketSend0(int socketNum, unsigned char* data, unsigned dataSize);

int main()
{
	printf("This is TCP Server.\n");

	// 0 初始化网络库
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested = MAKEWORD(2, 2);
		// 初始化套接字库
	err = WSAStartup(wVersionRequested, &wsaData);
	if (err != 0)
	{
		printf("WSAStartup errorNum = %d\n", GetLastError());
		return err;
	}
	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		printf("LOBYTE errorNum = %d\n", GetLastError());
		WSACleanup();
		return -1;
	}

	// 1 socket 安装
	SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);  //IPV4 TCP
	if (INVALID_SOCKET == sockSrv)
	{
		printf("socket errorNum = %d\n", GetLastError());
		return -1;
	}

	// 2 bind  分配
	SOCKADDR_IN addrSrv{};
	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  //支持任意地址
	addrSrv.sin_family = AF_INET;  //IPV4
	addrSrv.sin_port = htons(6000);//端口号
	if (SOCKET_ERROR == bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR))) {
		printf("bind errorNum = %d\n", GetLastError());
		return -1;
	}

	// 3 listen 监听
	if (SOCKET_ERROR == listen(sockSrv, 5)) {
		printf("listen errorNum = %d\n", GetLastError());
		return -1;
	}

	// 4 accept 接收连接
	SOCKADDR_IN addrCli{};
	int len = sizeof(SOCKADDR);
	while (1) {
		//新建一个分机 去处理连接
		SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrCli,&len);
		char sendBuf[100] = { 0 };
		sprintf_s(sendBuf, 100, "Welcome %s !", inet_ntoa(addrCli.sin_addr));  //打印一下连接上的IP地址(转字符串)
		// 5 write  &  read  发收数据
		// 
		//int iLen = send(sockConn, sendBuf, strlen(sendBuf),0);
		int iLen = MySocketSend0(sockConn, (unsigned char*)sendBuf, 100);    //   TODO:: !!!!!!!!!!!!!!!!
		char recvBuf[100] = { 0 };
		//
		//iLen = recv(sockConn, recvBuf, 100, 0);
		iLen = MySocketRecv0(sockConn, recvBuf,100 );
		printf("recvBuf = %s\n", recvBuf);
		// 6 关闭分机
		closesocket(sockConn);  //关闭分机
	}

	// 7 关闭总机
	closesocket(sockSrv);
	// 关闭网络
	WSACleanup();
	system("pause");
	return 0;
}

int MySocketRecv0(int sock, char* buf, int dateSize)
{
	//循环接收
	int numsRecvSoFar = 0;   //目前收到的数据 比如 0
	int numsRemainingToRecv = dateSize;   //还需收到的数据 比如200
	printf("enter MySocketRecv0\n");
	while (1)
	{
		int bytesRead = recv(sock, &buf[numsRecvSoFar], numsRemainingToRecv, 0);  //刚收数据 比如150    又刚收50
		printf("###bytesRead = %d,numsRecvSoFar = %d, numsRemainingToRecv = %d\n",
			bytesRead, numsRecvSoFar, numsRemainingToRecv);
		if (bytesRead == numsRemainingToRecv)  //刚收150 != 还需200  刚收50==还需收50 结束
		{
			return 0;
		}
		else if (bytesRead > 0)   //刚收150 > 0
		{
			numsRecvSoFar += bytesRead;  // 目前收到 0+150=150 数据
			numsRemainingToRecv -= bytesRead; //还需收 200-150=50 数据
			continue;
		}
		else if ((bytesRead < 0) && (errno == EAGAIN))
		{
			continue;
		}
		else
		{
			return -1;
		}
	}
}
int MySocketSend0(int socketNum, unsigned char* data, unsigned dataSize)
{
	unsigned numBytesSentSoFar = 0;
	unsigned numBytesRemainingToSend = dataSize;
	printf("enter MySocketSend0\n");
	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;
		}
	}
}

3、客户端

#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>

#pragma comment(lib,"ws2_32.lib") 

int MySocketRecv0(int sock, char* buf, int dateSize);
int MySocketSend0(int socketNum, unsigned char* data, unsigned dataSize);

int main()
{
	printf("This is TCP Client.\n");

	// 0 初始化网络库  任何网络编程都要先做这一步!!!!!!
		 // 加载套接字库
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested = MAKEWORD(1, 1);
	// 初始化套接字库
	err = WSAStartup(wVersionRequested, &wsaData);
	if (err != 0)
	{
		return err;
	}
	if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
	{
		WSACleanup();
		return -1;
	}
	// 1 安装socket
	SOCKET sockCli = socket(AF_INET, SOCK_STREAM, 0);   //IP4 面向链接
	//可写 试错  如果初始化网络库失败 返回-1
	if (INVALID_SOCKET == sockCli)
	{
		printf("socket errorNum = %d\n", GetLastError());
		return -1;
	}

	// 2 配置要连接的服务器
	  //结构体
	SOCKADDR_IN addrSrv;   //定义主机
	addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.35.8");  //cmd->ipconfig  本机ip地址
	addrSrv.sin_family = AF_INET;   //协议族是IPV4
	addrSrv.sin_port = htons(6000);   //端口6000
	// 连接服务器
  //connect(sockCli, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));   // 下面容错版
	if (SOCKET_ERROR == connect(sockCli, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)))
	{
		printf("connect errorno = %d\n", GetLastError());
		return -1;
	}

	// 3 收&发数据
	char recvBuf[100] = { 0 };
	// 收数据
	// 
	//int iLen = recv(sockCli, recvBuf, 100, 0);
	int iLen = MySocketRecv0(sockCli, recvBuf, 100);
	printf("recvBuf = %s\n", recvBuf);
	//  发数据
	const char sendBuf[100] = "The message is from client.";
	// 
	//iLen = send(sockCli, (char*)sendBuf, 100, 0);
	iLen = MySocketSend0(sockCli, (unsigned char*)sendBuf, strlen(sendBuf));

	//关闭套接字
	closesocket(sockCli);
	// 关闭网络
	WSACleanup();

	system("pause");
	return 0;
};

int MySocketRecv0(int sock, char* buf, int dateSize)
{
	//循环接收
	int numsRecvSoFar = 0;   //目前收到的数据 比如 0
	int numsRemainingToRecv = dateSize;   //还需收到的数据 比如200
	printf("enter MySocketRecv0\n");
	while (1)
	{
		int bytesRead = recv(sock, &buf[numsRecvSoFar], numsRemainingToRecv, 0);  //刚收数据 比如150    又刚收50
		printf("###bytesRead = %d,numsRecvSoFar = %d, numsRemainingToRecv = %d\n",
			bytesRead, numsRecvSoFar, numsRemainingToRecv);
		if (bytesRead == numsRemainingToRecv)  //刚收150 != 还需200  刚收50==还需收50 结束
		{
			return 0;
		}
		else if (bytesRead > 0)   //刚收150 > 0
		{
			numsRecvSoFar += bytesRead;  // 目前收到 0+150=150 数据
			numsRemainingToRecv -= bytesRead; //还需收 200-150=50 数据
			continue;
		}
		else if ((bytesRead < 0) && (errno == EAGAIN))
		{
			continue;
		}
		else
		{
			return -1;
		}
	}
}
int MySocketSend0(int socketNum, unsigned char* data, unsigned dataSize)
{
	unsigned numBytesSentSoFar = 0;
	unsigned numBytesRemainingToSend = dataSize;
	printf("enter MySocketSend0\n");
	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;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yy_xzz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值