C++网络编程

2022-10-05  本文已影响0人  何亮hook_8285

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
上一篇 下一篇

猜你喜欢

热点阅读