美文网首页
C++网络编程

C++网络编程

作者: 何亮hook_8285 | 来源:发表于2022-10-05 16:16 被阅读0次

    Window TCP 服务端

    • 注意事项
    1. 引入windows.h头文件
    2. 引入ws2_32.lib网络库
    #include <windows.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    void createTcpSocket()
    {
      //初始化Socket  
      WSADATA ws;
      WSAStartup(MAKEWORD(2,2),&ws);
      /**
      创建socket
      SOCKET socket(int af,int type,int protocal);
      af 表示一个网络地址类型,通常为AF_INET,表示套接字在Internet域中通信。
      type:表示套接字类型。如果为SOCK_STREAM,表示流式套接字,如果为SOCK_DGRAM,表示数据报套接字。
      protocal:表示网络协议,通常为0,表示采用TCP/IP协议。
      **/
      int sock=socket(AF_INET,SOCK_STREAM,0);
      if(sock==-1){
         printf("create socket failed!\n");
         return -1;
      }
       short port=9800; 
      //sockaddr_in 描述服务端描述,如端口、IP、地址族
       sockaddr_in saddr;
       saddr.sin_family = AF_INET; //地址族
       //htons函数将本地字节序转网络字节序
       saddr.sin_port = htons(port); //设置端口号
       //绑定IP地址,0表示所有网卡都作为TCP监听。
       saddr.sin_addr.s_addr = htonl(0);  
        //绑定端口等信息
       if(::bind(sock,(sockaddr*)&saddr,sizeof(saddr))!=0)    {
           //绑定端口失败
           printf("bind port %d failed!\n",port);
           return -2;
       }
       printf("bind port %d success!\n",port) 
       //告诉操作系统可以监听客户端的连接
       /**
       int listen(int sockfd, int backlog);
       第一个参数sockfd为创建socket返回的文件描述符。
       第二个参数backlog为建立好连接处于ESTABLISHED状态的队列的长度
       **/    
       listen(sock,10);
       
       //读取客户端的连接信息
        sockaddr_in caddr;
        socklen_t len=0;
        int clientSock=accept(sock,(sockaddr*)&caddr,&len);
        printf("accept client %d\n",clientSock);
        //inet_ntoa 函数是将结构转ip字符串
        char *ip=inet_ntoa(caddr.sin_addr);
        unsigned short cport=ntohs(caddr.sin_port);
        //读取客户端数据
        char buf[1024]={0};
        int recvlen= recv(clientSock,buf,sizeof(buf)-1,0);
        //发生消息
        send(clientSock,"ok",3,0);
        
        
      //关闭socket 
      closesocket(sock);
    }
    

    Linux TCP 服务端

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <stdio.h>
    #include <unistd.h>
    //atoi
    #include <stdlib.h>
    //htonl
    #include <arpa/inet.h>
    #include <string.h>
    
    void createSocket()
    {
          /**
      创建socket
      SOCKET socket(int af,int type,int protocal);
      af 表示一个网络地址类型,通常为AF_INET,表示套接字在Internet域中通信。
      type:表示套接字类型。如果为SOCK_STREAM,表示流式套接字,如果为SOCK_DGRAM,表示数据报套接字。
      protocal:表示网络协议,通常为0,表示采用TCP/IP协议。
      **/
      int sock=socket(AF_INET,SOCK_STREAM,0);
      if(sock==-1){
         printf("create socket failed!\n");
         return -1;
      }
      short port=9800; 
      //sockaddr_in 描述服务端描述,如端口、IP、地址族
       sockaddr_in saddr;
       saddr.sin_family = AF_INET; //地址族
       //htons函数将本地字节序转网络字节序
       saddr.sin_port = htons(port); //设置端口号
       //绑定IP地址,0表示所有网卡都作为TCP监听。
       saddr.sin_addr.s_addr = htonl(0);  
        //绑定端口等信息
       if(::bind(sock,(sockaddr*)&saddr,sizeof(saddr))!=0)    {
           //绑定端口失败
           printf("bind port %d failed!\n",port);
           return -2;
       }
    
       printf("bind port %d success!\n",port) 
       //告诉操作系统可以监听客户端的连接
       /**
       int listen(int sockfd, int backlog);
       第一个参数sockfd为创建socket返回的文件描述符。
       第二个参数backlog为建立好连接处于ESTABLISHED状态的队列的长度
       **/    
       listen(sock,10);
       
       //读取客户端的连接信息
        sockaddr_in caddr;
        socklen_t len=0;
        int clientSock=accept(sock,(sockaddr*)&caddr,&len);
        printf("accept client %d\n",clientSock);
        //inet_ntoa 函数是将结构转ip字符串
        char *ip=inet_ntoa(caddr.sin_addr);
        unsigned short cport=ntohs(caddr.sin_port);
        //读取客户端数据
        char buf[1024]={0};
        int recvlen= recv(clientSock,buf,sizeof(buf)-1,0);
        //发生消息
        send(clientSock,"ok",3,0); 
       //关闭socket
       close(sock);  
    }
    

    C++线程

    #include <thread>
    
    class TcpThread{
        
    public:
        void Main()
        {
            
        }
        
        int clientSock;
        
    }
    
    
    void createThread()
    {    
        TcpThread *th=new TcpThread();
        //创建线程
        thread sth(&TcpThread::Main,th);
        //拆分子线程与主线程关系
        sth.detach();
    }
    

    Makefile

    tcpserver:main.cpp
        g++ main.cpp -o tcpserver -std=c++11 -lpthread
    

    相关文章

      网友评论

          本文标题:C++网络编程

          本文链接:https://www.haomeiwen.com/subject/perzwrtx.html