首页 > 其他分享 >多线程网络通信

多线程网络通信

时间:2023-11-28 14:13:13浏览次数:29  
标签:网络通信 多线程 buffer sizeof include clientSocket 客户端

当多客户端同时连接和服务端持续监听时,涉及到多线程,每当有新的客户端连接时,就创建一个新的线程来处理与该客户端的通信,从而允许服务器端同时与多个客户端建立连接。

直接贴代码:

 1 // main.cpp
 2 #include <QCoreApplication>
 3 #include <iostream>
 4 #include <QDebug>
 5 #include <cstring>
 6 #include <WinSock2.h>
 7 #include <thread>
 8 #include <vector>
 9 
10 #pragma comment(lib, "ws2_32.lib")
11 #ifdef _WIN32
12     typedef int socklen_t;
13 #endif
14 
15 void handleClient(int clientSocket)
16 {
17     //处理与客户端的通信
18     char buffer[1024];
19     memset(buffer, 0, sizeof(buffer));
20     recv(clientSocket, buffer, sizeof(buffer), 0);
21     std::cout << "Received from client: " << buffer << std::endl;
22 
23     const char* message = "Hello client!";
24     send(clientSocket, message, strlen(message), 0);
25 
26     //关闭客户端套接字
27     closesocket(clientSocket);
28 }
29 
30 int main(int argc, char *argv[])
31 {
32     QCoreApplication a(argc, argv);
33 
34 #ifdef _WIN32
35     WSADATA wsaData;
36     if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
37         std::cerr << "Failed to initialize WinSock" << std::endl;
38         return -1;
39     }
40 #endif
41 
42     //创建套接字
43     int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
44     if (serverSocket == -1)
45     {
46         std::cerr << "Error creating socket" << std::endl;
47         return -1;
48     }
49 
50     //准备地址结构
51     sockaddr_in serverAddress;
52     serverAddress.sin_family = AF_INET;
53     serverAddress.sin_port = htons(8888);
54     serverAddress.sin_addr.s_addr = INADDR_ANY;
55 
56     //绑定套接字
57     if (bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) == -1)
58     {
59         std::cerr << "Error binding socket" << std::endl;
60         return -1;
61     }
62 
63     //监听连接请求
64     if (listen(serverSocket, 5) == -1)
65     {
66         std::cerr << "Error listening on socket" << std::endl;
67         closesocket(serverSocket);
68         return -1;
69     }
70 
71     std::cout << "Waiting for clients to connect..." << std::endl;
72 
73     //循环接受连接请求
74     std::vector<std::thread> threads;
75     while (true)
76     {
77         //接受连接请求
78         sockaddr_in clientAddress;
79         socklen_t ClientAddressLength = sizeof(clientAddress);
80         int clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddress, &ClientAddressLength);
81         if (clientSocket == -1)
82         {
83             std::cerr << "Error accepting connection" << std::endl;
84             continue;
85         }
86 
87         std::cout << "Connection established with client" << std::endl;
88 
89         //创建一个新的线程来处理与客户端的通信
90         threads.emplace_back(std::bind(handleClient, clientSocket));
91     }
92 
93     //关闭服务端套接字
94     closesocket(serverSocket);
95 
96     return a.exec();
97 }

 

标签:网络通信,多线程,buffer,sizeof,include,clientSocket,客户端
From: https://www.cnblogs.com/l-yy/p/17861830.html

相关文章

  • Linux多线程同步机制(下)
    @TOC前言一、读写锁多线程同步机制中的读写锁(Read-WriteLock)是一种特殊的锁机制,用于控制对共享资源的读写访问。读写锁允许多个线程同时读取共享资源,但在写操作时需要独占访问。读写锁的基本原则是:多个线程可以同时获取读锁,但只有一个线程可以获取写锁。当有线程持有写锁时,其他线......
  • socket测试(多线程,课上测试)
    基于socket实现daytime(13)服务器(端口我们使用13+后三位学号)和客户端服务器响应消息格式是“客户端IP:XXXX客户端PID:XXXX服务器tid:XXXX服务器实现者学号:XXXXXXXX当前时间:XX:XX:XX”注意服务器端要通过多线程实现,每次客户端链接到服务器,服务器就启动一个新线程和客户端连......
  • 多线程复制文件夹
    pThread复制文件夹C++通过pthread复制文件夹。主要处理普通文件和链接文件。事实上只要处理好链接文件即可。我们可以通过判断链接的文件是文件夹还是文件即可判断对当前文件是通过文件直接复制还是通过文件夹递归复制。#include<iostream>#include<dirent.h>#include<stri......
  • std::future与std::promise在C++多线程同步与数据共享中的应用
    1、std::promise与std::futurestd::promise与std::future通过配合使用完成数据的同步与共享,两者均是模板类;std::promise存储异步执行的值或异常;std::future提供可供访问的异步执行结果。二者配合使用伪码如下:std::promise<Type>pr;std::future<Type>fu(pr.get_fu......
  • 多线程
    1.进程和线程进程是一个应用程序线程是一个进程中执行场景,执行单元一个进程可以启动多个线程,进程与进程之间内存独立不共享2.在Java语言中:任意两个线程与线程之间,堆内存和方法区内存共享,因为对内存和方法区只有一个,但是栈内存独立,一个线程一个栈,栈内存有很多个假设有十个线程,会有......
  • 多线程2.0
    说起进程就不得不说程序。程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念而进程则是执行程序的一次执行过程,他是一个动态的概念,是系统资源分配的单位通常在一个进程中可以包含若干个线程,当然一个进程至少有一个线程,不然没有存在的意义,线程是cpu调度和执行的......
  • 多线程.模拟龟兔赛跑
    packageJavaSE.Thread.document01;/***模拟龟兔赛跑*/publicclassDemo05implementsRunnable{publicstaticStringwinner;//胜者@Overridepublicvoidrun(){for(inti=1;i<=100;i++){if(Thread.currentThread().getName()......
  • 多线程编程之——终止(打断)正在执行中的线程
    多线程编程之——终止(打断)正在执行中的线程ps:文字有点多,想看结果的,直接跳转:《二》一、基础知识1、我们基于spring开发,把线程都交给spring把线程交给spring管理好不好?将线程交给Spring管理是一个常见的做法,特别是在基于Spring的应用程序中。通过将线程纳入Spring的管理......
  • 一个用于多线程共享数据保护测试的简易游戏服务器代码
    #include<iostream>#include<thread>#include<list>#include<mutex>//一个线程负责从客户端读取用户的命令,放入一个队列中;//另一个线程负责从队列中读取命令并解析,假设用一个int变量代表一个命令。classA{public://这里无法模拟从网络接受命令的过程,我们......
  • 多线程
    多线程线程其实是程序中的一条执行路径我之前所以写的程序,其实都是单线程程序那么怎样的程序才是多线程程序呢?支持同时有很多人一起进入网站,并且每一个人的行为互不影响。例如百度网盘中,可以同时上传或者下载的多个文件,这些程序中其实就有多条执行路径,每一个执行路径就是一条......