C++ネットワークプログラミング学習:基礎TCPサービス端/クライアントを確立する


ネットワークプログラミング学習レコード
  • で使用される言語はC/C++
  • です.
  • ソースコードでサポートされているプラットフォームは、Windows
  • です.
    笔记一:基础TCP服务端/クライアント 点我跳转笔记二:ネットワークデータメッセージの送受信 点我跳转笔记三:selectネットワークモデル 点我跳转笔记四:プラットフォームをまたいでWindowsをサポート、Linuxシステム 点我跳转笔记5:ソースコードのパッケージ 点我跳转笔记6:バッファオーバーフローと粘着包分包 点我跳转笔记7:サービス端マルチスレッド分离业务処理高负荷 点我跳转笔记
    メモ1
  • ネットワークプログラミング学習記録
  • 一、簡易TCPサービス端末
  • を確立する
  • 1.サービス側概略フロー
  • の確立
  • 2.コード実装および詳細注釈
  • 二、簡易TCPクライアント
  • を確立する
  • 1.クライアント概略フロー
  • を確立する
  • 2.コード実装および詳細注釈
  • 三、持続可能な処理要求を確立するネットワークプログラム
  • 1.考え方
  • 2.コード実装および詳細注釈
  • 2.1サービス側コード
  • 2.2クライアントコード


  • 一、簡易TCPサービスを確立する
    1.サービス側の大まかな流れを確立する
  • ソケット
  • を確立する
  • クライアント接続をバインドするポート(bind)
  • リスニングネットワークポート(listen)
  • クライアント接続受信待ち
  • クライアントから送信データ(recv)
  • を受信する
  • クライアントにデータ送信(send)
  • クローズソケット
  • 2.コード実装および詳細なコメント
    #define WIN32_LEAN_AND_MEAN//              
    
    #include//      windows.h      ,      
    #include
    #include
    
    #pragma comment(lib,"ws2_32.lib")//         windows   
    
    using namespace std; 
     
    int main() 
    {
         
    	//  windows socket 2,x   windows   
    	WORD ver = MAKEWORD(2,2);//WinSock     
    	WSADATA dat;//        WSAStartup        Socket   
    	if(0 != WSAStartup(ver,&dat))//        0 
    	{
         
    		return 0;
    	}
    	
    	//    socket 
    	SOCKET _mysocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//IPV4       TCP   
    	if(INVALID_SOCKET == _mysocket)//     
        {
            
            return 0;  
        } 
        
    	//       IP   
    	sockaddr_in _myaddr = {
         };//  sockaddr     sockaddr_in                    
    	_myaddr.sin_family = AF_INET;//IPV4
    	_myaddr.sin_port = htons(8888);//   host to net unsigned short
    	_myaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//     INADDR_ANY          
    	if(SOCKET_ERROR == bind(_mysocket,(sockaddr*)&_myaddr,sizeof(sockaddr_in)))//socket (    )sockaddr          
    	{
         
    		cout<<"     "<<endl;
    	}
    	else
    	{
         
    		//cout<
    	}
    	
    	//      
    	if(SOCKET_ERROR == listen(_mysocket,5))//            
    	{
         
    		cout<<"    "<<endl;
    	}
    	else
    	{
         
    		//cout<
    	}
    	
    	//         
    	sockaddr_in _clientAddr = {
         };//  sockadd           
    	int _addr_len = sizeof(sockaddr_in);//  sockadd      
    	SOCKET _temp_socket = INVALID_SOCKET;//         
    	char _buf[256] = {
         };//           
    	while(true)
    	{
         
    		_temp_socket = accept(_mysocket,(sockaddr*)&_clientAddr,&_addr_len);//                   
    		if(INVALID_SOCKET == _temp_socket)//     
    		{
         
    			cout<<"        Socket"<<endl;
    		}
    		else
    		{
         
    			cout<<"      "<<endl; 
    			printf("IP   :%s 
    "
    , inet_ntoa(_clientAddr.sin_addr)); } // char _buf[256] = { }; int _buf_len = recv(_temp_socket,_buf,256,0); if(_buf_len>0) { printf("%s
    "
    ,_buf); } // char _msg[] = "HelloWorld"; send(_temp_socket,_msg,strlen(_msg)+1,0);// flag // socket closesocket(_temp_socket); } // socket closesocket(_mysocket); // windows socket WSACleanup(); return 0; }

    二、簡易TCPクライアントの確立
    1.クライアントの概略フローの確立
  • ソケット
  • を確立する
  • 接続サーバ
  • クライアントにデータ送信(send)
  • クライアントから送信データ(recv)
  • を受信する
  • クローズソケット
  • 2.コード実装および詳細なコメント
    #define WIN32_LEAN_AND_MEAN
    
    #include
    #include
    #include
    
    #pragma comment(lib,"ws2_32.lib")//         windows   
    
    using namespace std; 
     
    int main()
    {
         
    	//  windows socket 2,x   windows   
    	WORD ver = MAKEWORD(2,2);//WinSock     
    	WSADATA dat;//        WSAStartup        Socket   
    	if(0 != WSAStartup(ver,&dat))//        0 
    	{
         
    		return 0;
    	}
    	
    	//    socket 
    	SOCKET _mysocket = socket(AF_INET,SOCK_STREAM,0);//IPV4               
    	if(INVALID_SOCKET == _mysocket)//     
        {
            
            return 0;  
        } 
        
        //     
        sockaddr_in _sin = {
         };//sockaddr    
        _sin.sin_family = AF_INET;//IPV4
        _sin.sin_port = htons(8888);//         
    	_sin.sin_addr.S_un.S_addr =  inet_addr("127.0.0.1");//     IP 
    	if(SOCKET_ERROR == connect(_mysocket,(sockaddr*)&_sin,sizeof(sockaddr_in)))
    	{
         
    		cout<<"    "<<endl;
    		closesocket(_mysocket);
    	}
    	else
    	{
         
    		cout<<"    "<<endl; 
    	}
    	
    	//        
    	char _msg[] = "HelloServer";
    	send(_mysocket,_msg,strlen(_msg)+1,0);//               flag 
    	
    	//        
    	char _buf[256] = {
         };
    	int _buf_len = recv(_mysocket,_buf,256,0);
    	if(_buf_len>0)
    	{
         
    		printf("%s
    "
    ,_buf); } // socket closesocket(_mysocket); // windows socket WSACleanup(); return 0; }

    三、持続可能な処理要求のネットワークプログラムを確立する
    1.考え方
      socket接続後、すなわちサービス側がaccept操作、クライアントがconnect操作を行った後、ループを使用してsend/recv操作でデータを転送すると、持続的な処理要求を実現できます.
    2.コード実装および詳細なコメント
    2.1サービス側コード
    #define WIN32_LEAN_AND_MEAN
    
    #include
    #include
    #include
    
    #pragma comment(lib,"ws2_32.lib")//         windows   
    
    using namespace std; 
     
    int main() 
    {
         
    	//  windows socket 2,x   windows   
    	WORD ver = MAKEWORD(2,2);//WinSock     
    	WSADATA dat;//        WSAStartup        Socket   
    	if(0 != WSAStartup(ver,&dat))//        0 
    	{
         
    		return 0;
    	}
    	
    	//    socket 
    	SOCKET _mysocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//IPV4       TCP   
    	if(INVALID_SOCKET == _mysocket)//     
        {
            
            return 0;  
        } 
        
    	//       IP   
    	sockaddr_in _myaddr = {
         };//  sockaddr     sockaddr_in                    
    	_myaddr.sin_family = AF_INET;//IPV4
    	_myaddr.sin_port = htons(8888);//   host to net unsigned short
    	_myaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//     INADDR_ANY          
    	if(SOCKET_ERROR == bind(_mysocket,(sockaddr*)&_myaddr,sizeof(sockaddr_in)))//socket (    )sockaddr          
    	{
         
    		cout<<"     "<<endl;
    	}
    	else
    	{
         
    		//cout<
    	}
    	
    	//      
    	if(SOCKET_ERROR == listen(_mysocket,5))//            
    	{
         
    		cout<<"    "<<endl;
    	}
    	else
    	{
         
    		//cout<
    	}
    	
    	//         
    	sockaddr_in _clientAddr = {
         };//  sockadd           
    	int _addr_len = sizeof(sockaddr_in);//  sockadd      
    	SOCKET _temp_socket = INVALID_SOCKET;//         
    	char _buf[256] = {
         };//           
    	
    	_temp_socket = accept(_mysocket,(sockaddr*)&_clientAddr,&_addr_len);//                   
    	if(INVALID_SOCKET == _temp_socket)//     
    	{
         
    		cout<<"        Socket"<<endl;
    	}
    	else
    	{
         
    		cout<<"      "<<endl; 
    		printf("IP   :%s 
    "
    , inet_ntoa(_clientAddr.sin_addr)); } while(true)// { // int _buf_len = recv(_temp_socket,_buf,256,0); if(_buf_len<=0) { printf("
    "
    ); break; } if(0 == strcmp(_buf,"getname")) { // char _msg[] = "My name is Mr.Zhao"; send(_temp_socket,_msg,strlen(_msg)+1,0);// flag } else if(0 == strcmp(_buf,"getage")) { // char _msg[] = "My age is 19"; send(_temp_socket,_msg,strlen(_msg)+1,0);// flag } else { // char _msg[] = "???"; send(_temp_socket,_msg,strlen(_msg)+1,0);// flag } } // socket closesocket(_temp_socket); // socket closesocket(_mysocket); // windows socket WSACleanup(); printf(" , "); getchar(); return 0; }

    2.2クライアントコード
    #define WIN32_LEAN_AND_MEAN
    
    #include
    #include
    #include
    
    #pragma comment(lib,"ws2_32.lib")//         windows   
    
    using namespace std; 
     
    int main()
    {
         
    	//  windows socket 2,x   windows   
    	WORD ver = MAKEWORD(2,2);//WinSock     
    	WSADATA dat;//        WSAStartup        Socket   
    	if(0 != WSAStartup(ver,&dat))//        0 
    	{
         
    		return 0;
    	}
    	
    	//    socket 
    	SOCKET _mysocket = socket(AF_INET,SOCK_STREAM,0);//IPV4               
    	if(INVALID_SOCKET == _mysocket)//     
        {
            
            return 0;  
        } 
        
        //     
        sockaddr_in _sin = {
         };//sockaddr    
        _sin.sin_family = AF_INET;//IPV4
        _sin.sin_port = htons(8888);//         
    	_sin.sin_addr.S_un.S_addr =  inet_addr("127.0.0.1");//     IP 
    	if(SOCKET_ERROR == connect(_mysocket,(sockaddr*)&_sin,sizeof(sockaddr_in)))
    	{
         
    		cout<<"    "<<endl;
    		closesocket(_mysocket);
    	}
    	else
    	{
         
    		cout<<"    "<<endl; 
    	}
    	
    	while(true)//  
    	{
         
    		//     
    		char _msg[256] = {
         };
    		scanf("%s",_msg);
    		//     
    		if(0 == strcmp(_msg,"exit"))//  
    		{
         
    			break;
    		}
    		else
    		{
         
    			//        
    			send(_mysocket,_msg,strlen(_msg)+1,0);//               flag
    		}
    		//        
    		char _buf[256] = {
         };
    		int _buf_len = recv(_mysocket,_buf,256,0);
    		if(_buf_len>0)
    		{
         
    			printf("%s
    "
    ,_buf); } } // socket closesocket(_mysocket); // windows socket WSACleanup(); return 0; }