zoukankan      html  css  js  c++  java
  • 套接字Socket

    TCP/IPTransmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。UDPUser Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

    与Socket相关的网络编程服务器端实现

    #include <iostream>
    #include <Windows.h> 
    using namespace std; 
    #define  PORT 4000
    #define  IP_ADDRESS "127.0.0.1"
    
    DWORD WINAPI ClientThread(LPVOID lpParameter)
    {
         SOCKET CientSocket = (SOCKET)lpParameter;
         int Ret = 0;
        char RecvBuffer[MAX_PATH];
    	
          while ( true )
          {
              memset(RecvBuffer, 0x00, sizeof(RecvBuffer));
              Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0);
              if ( Ret == 0 || Ret == SOCKET_ERROR ) 
              {
                 cout<<"客户端退出!"<<endl;
                  break;
              }
              cout<<"接收到客户信息为:"<<RecvBuffer<<endl;
          }
     
          return 0;
      }
      
    int main(int argc, char* argv[])
    {
         WSADATA  Ws;
         SOCKET ServerSocket, CientSocket;
         struct sockaddr_in LocalAddr, ClientAddr;	 	 
    	 int Ret = 0;
    	 int AddrLen = 0;
    	 HANDLE hThread = NULL;
    
         //Init Windows Socket
         if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
    	 {
           cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
             return -1;    }
        //Create Socket    
    	 ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
         if (ServerSocket == INVALID_SOCKET )
         {
             cout<<"Create Socket Failed::"<<GetLastError()<<endl;
              return -1;
         }
      
          LocalAddr.sin_family = AF_INET;
          LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
          LocalAddr.sin_port = htons(PORT);
          memset(LocalAddr.sin_zero, 0x00, 8);
      
          //Bind Socket
          Ret = bind(ServerSocket, (struct sockaddr*)&LocalAddr, sizeof(LocalAddr));
          if ( Ret != 0 )
          {
              cout<<"Bind Socket Failed::"<<GetLastError()<<endl;
              return -1;
          }
      
          Ret = listen(ServerSocket, 10);
          if ( Ret != 0 )
          {
              cout<<"listen Socket Failed::"<<GetLastError()<<endl;
              return -1;
          }
      
          cout<<"服务端已经启动"<<endl;
      
          while ( true )
          {
              AddrLen = sizeof(ClientAddr);
              CientSocket = accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen);
              if ( CientSocket == INVALID_SOCKET )
              {
                  cout<<"Accept Failed::"<<GetLastError()<<endl;
                  break;
              }
      
              cout<<"客户端连接::"<<inet_ntoa(ClientAddr.sin_addr)<<":"<<ClientAddr.sin_port<<endl;
              
              hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)CientSocket, 0, NULL);
              if ( hThread == NULL )
              {
                  cout<<"Create Thread Failed!"<<endl;
                  break;
              }
      
              CloseHandle(hThread);
          }  
          closesocket(ServerSocket);
          closesocket(CientSocket);
          WSACleanup(); 
          return 0;
    } 
    

      客户端实现:

     
     //Client.cpp
      #include <iostream>
      #include <Windows.h>
      
      using namespace std;
      
      #define  PORT 4000
      #define  IP_ADDRESS "127.0.0.1"
      
     
     int main(int argc, char* argv[])
     {
         WSADATA  Ws;
         SOCKET CientSocket;
         struct sockaddr_in ServerAddr;
         int Ret = 0;
         int AddrLen = 0;
         HANDLE hThread = NULL;
         char SendBuffer[MAX_PATH];
    
         //Init Windows Socket
         if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
         {
             cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
             return -1;
         }
     
         //Create Socket
         CientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
         if ( CientSocket == INVALID_SOCKET )
         {
             cout<<"Create Socket Failed::"<<GetLastError()<<endl;
             return -1;
         }
     
         ServerAddr.sin_family = AF_INET;
         ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
         ServerAddr.sin_port = htons(PORT);
         memset(ServerAddr.sin_zero, 0x00, 8);
     
         Ret = connect(CientSocket,(struct sockaddr*)&ServerAddr, sizeof(ServerAddr));
         if ( Ret == SOCKET_ERROR )
         {
             cout<<"Connect Error::"<<GetLastError()<<endl;
             return -1;
         }
         else
         {
             cout<<"连接成功!"<<endl;
         }
     
         while ( true )
         {
             cin.getline(SendBuffer, sizeof(SendBuffer));
             Ret = send(CientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
             if ( Ret == SOCKET_ERROR )
             {
                 cout<<"Send Info Error::"<<GetLastError()<<endl;
                 break;
             }
         }
         
         closesocket(CientSocket);
         WSACleanup();
     
         return 0;
     }
    

      

      

  • 相关阅读:
    三元操作符的类型务必一致
    a++ 和 ++a 的区别
    TCP/IP四层协议模型与ISO七层模型
    CentOS 7.0 使用 yum 安装 MariaDB 与 MariaDB 的简单配置
    修改gcc/g++默认include路径
    js中Math.random()生成指定范围数值的随机数
    在 QML 中创建 C++ 导入类型的实例
    QML从文件加载组件简单示例
    Android插件化开发---执行未安装apk中的Service
    游戏开发热门技术浅析
  • 原文地址:https://www.cnblogs.com/super86/p/3397687.html
Copyright © 2011-2022 走看看