c++千万级别高并发网络编程(二)

持续性处理网络请求

  • 新增内容
  • 服务器整体代码
  • 客户端整体代码

新增内容

  • 客户端能够持续处理请求,直至用户选择退出
  • 服务器端接受客户端的请求,并针对性做处理

服务器整体代码

#define WIN32_LEAN_AND_MEAN
#define SOCKET int  //VS2015已经定义好的,可以直接用
#include
#include
#include
#include
int main()
{
  WORD ver = MAKEWORD(2,2);//调用API2代创建2.x版本
  WSADATA dat;
  WSAStartup(ver,&dat);//启动
  //创建套接字
  SOCKET  seradd =socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  //bind
  SOCKADDR_IN _sin = {};	
  _sin .sin_family = AF_INET;
//sin_port和sin_addr都必须是网络字节序(NBO),一般可视化的数字都是主机字节序。所以需要转换host to net unsigned.数字可改 
  _sin .sin_port = htons(1234);
  _sin.sin_addr_s_un.S_addr = INADDR_ANY;//访问本机任何网络地址都可以,具体也可以改为本机的某个特定地址
  if (SOCKET_ERROR == bind(seradd , (sockaddr *) &_sin , sizeof(_sin)))
  {
  	std::cout<<"绑定失败"<<endl;
  }
  //监听
  if (SOCKET_ERROR == listen(seradd,5))
  {
  	std::cout<<"绑定失败"<<endl;
  }
  //接受
  sockaddr_in clentAddr = {};//不用赋值了,因为是监听到的,不是给定的
  int nAddrLen = sizeof(sockaddr_in);//给定长度
  SOCKET _cSock = INVAID_SOCKET;
  //发送内容需要预先说定
  char msgbuf[] = "XXXXXXX";
  _cSock = accept(seradd,(sockaddr *) &clentAddr,nAddrLen);
  if(_cSock = INVAID_SOCKET)
  {
  		std::cout<<"获取失败"<<endl;
  }
  char _recvBuf[128] = {};
  while(true)
  {
  	//先接受客户端数据(新增)
  	int nLen = recv(_cSock,_recvBuf,128,0);
  	 if(nLen <= 0)
  	 {
  	 		cout<<"客户端已经退出,任务结束"<<endl;
  	 }
  	 //新增:处理请求
  	 if(0 == strcmp(_recvBuf,"XXX"))
  	 {
  	 }
  	 else if(0 == strcmp(_recvBuf,"exit"))
  	 {
  	 		cout<<"客户端已退出"<<endl;
  	  }
  	 else
  	 {
  	 	send(_cSock,msgbuf,sizeof(msgbuf)+1,0);//发送msgbuf中的内容。如果长度确定则不应该每次都重新计算
  	 }
  	
  }
  closesocket(seradd);
  WSAcleanup();//关闭
}

客户端整体代码

#define WIN32_LEAN_AND_MEAN
#include
#include
#include
int main()
{
    WORD ver = MAKEWORD(2,2);//调用API2代创建2.x版本
    WSADATA dat;
    WSAStartup(ver,&dat);//启动
    SOCKET  cliadd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    //bind
    SOCKADDR_IN _sin = {};	
    _sin .sin_family = AF_INET;
//sin_port和sin_addr都必须是网络字节序(NBO),一般可视化的数字都是主机字节序。所以需要转换host to net unsigned.数字可改 
	_sin .sin_port = htons(4567);//和拂去其不同
	_sin.sin_addr_s_un.S_addr = inet_addr("127.0.0.1");//绑定服务器地址
	if (SOCKET_ERROR == connect(cliadd, (sockaddr *) &_sin , sizeof(_sin)))
	{
		std::cout<<"连接失败"<<endl;
	}
	//新增,接收用户输入数据
	while(true)
	{
		char inputBuf[128] = {};
		cin>>inputBuf;
		//接收用户数据,如果是exit就退出
		if(0 == strcmp(inputBuf,"exit"))
		{
		    send(cliadd,inputBuf,sizeof(inputBuf)+1,0);
		    break;
		}
		else
		{
			send(cliadd,inputBuf,sizeof(inputBuf)+1,0);
		}
	    //接受数据
		char recvBuf[128] = {};//最多可以接受的字符
		int nLen = recv(cliadd,recvBuf,0);
		if(nLen > 0 )
		{
			cout<<"接受到的数据:"<<recvBuf<<endl;
		}
   }
   closesocket(cliadd);
   WSAcleanup();//关闭
}

你可能感兴趣的:(网络编程,项目)