首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

基于linux的socket多线程通信

基础概念

Linux中的Socket是一种网络通信机制,允许不同计算机上的进程进行通信。Socket API提供了一组函数,用于创建、绑定、监听、连接和传输数据。多线程通信是指在一个进程中使用多个线程来处理并发任务,每个线程可以独立地执行不同的任务。

优势

  1. 并发处理:多线程可以同时处理多个客户端请求,提高系统的响应速度和处理能力。
  2. 资源共享:多个线程可以共享进程的内存空间和资源,减少资源浪费。
  3. 灵活性:可以根据需要动态创建和销毁线程,适应不同的负载情况。

类型

  1. TCP Socket:面向连接的通信方式,保证数据的可靠传输,适用于需要高可靠性的应用场景。
  2. UDP Socket:无连接的通信方式,传输速度快但不保证数据的可靠传输,适用于实时性要求高的应用场景。

应用场景

  1. 服务器端:用于处理多个客户端的并发请求,如Web服务器、聊天服务器等。
  2. 客户端:用于与服务器进行通信,如文件传输、在线游戏等。

示例代码

以下是一个基于Linux的TCP Socket多线程通信的简单示例:

服务器端代码

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>

#define BUF_SIZE 1024

void *client_handler(void *arg) {
    int client_sock = *(int *)arg;
    char buffer[BUF_SIZE];
    while (1) {
        int len = read(client_sock, buffer, BUF_SIZE);
        if (len == 0) {
            close(client_sock);
            break;
        }
        write(client_sock, buffer, len); // Echo back the message
    }
    return NULL;
}

int main(int argc, char *argv[]) {
    int serv_sock, clnt_sock;
    struct sockaddr_in serv_adr, clnt_adr;
    socklen_t clnt_adr_sz;
    pthread_t t_id;

    if (argc != 2) {
        printf("Usage: %s <port>\n", argv[0]);
        exit(1);
    }

    serv_sock = socket(PF_INET, SOCK_STREAM, 0);
    memset(&serv_adr, 0, sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_adr.sin_port = htons(atoi(argv[1]));

    if (bind(serv_sock, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) == -1) {
        perror("bind() error");
        exit(1);
    }

    if (listen(serv_sock, 5) == -1) {
        perror("listen() error");
        exit(1);
    }

    while (1) {
        clnt_adr_sz = sizeof(clnt_adr);
        clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_adr, &clnt_adr_sz);
        pthread_create(&t_id, NULL, client_handler, (void *)&clnt_sock);
        pthread_detach(t_id);
    }

    close(serv_sock);
    return 0;
}

客户端代码

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 1024

int main(int argc, char *argv[]) {
    int sock;
    struct sockaddr_in serv_addr;
    char buffer[BUF_SIZE];

    if (argc != 3) {
        printf("Usage: %s<IP> <port>\n", argv[0]);
        exit(1);
    }

    sock = socket(PF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
        perror("socket() error");
        exit(1);
    }

    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
    serv_addr.sin_port = htons(atoi(argv[2]));

    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) {
        perror("connect() error");
        exit(1);
    }

    while (1) {
        printf("Input message(Q to quit): ");
        fgets(buffer, BUF_SIZE, stdin);
        if (!strcmp(buffer, "q\n") || !strcmp(buffer, "Q\n"))
            break;

        write(sock, buffer, strlen(buffer));
        int len = read(sock, buffer, BUF_SIZE - 1);
        buffer[len] = 0;
        printf("Message from server: %s", buffer);
    }

    close(sock);
    return 0;
}

常见问题及解决方法

  1. 线程安全问题:多个线程同时访问共享资源时可能会导致数据不一致。解决方法是使用互斥锁(mutex)或其他同步机制来保护共享资源。
  2. 资源耗尽:创建过多线程可能导致系统资源耗尽。解决方法是限制线程数量,使用线程池来管理线程。
  3. 网络延迟:网络延迟可能导致数据传输缓慢。解决方法是优化网络配置,使用更高效的网络协议或算法。

参考链接

通过以上示例代码和解释,您可以了解基于Linux的Socket多线程通信的基础概念、优势、类型、应用场景以及常见问题的解决方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python多线程通信_python socket多线程

由于线程是操作系统直接支持的执行单元,因此,高级语言(如 Python、Java 等)通常都内置多线程的支持。...,由于线程可以对全局变量随意修改,这就可能造成多线程之间全局变量的混乱。...互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。 在 threading 模块中使用 Lock 类可以方便处理锁定。...,剩余 95 张电影票 购买成功,剩余 94 张电影票 购买成功,剩余 93 张电影票 购买成功,剩余 92 张电影票 购买成功,剩余 91 张电影票 购买成功,剩余 90 张电影票 使用队列在线程间通信...我们知道 mutliprocessing 模块的 Queue 队列可以实现进程间通信,同样在线程间也可以使用 Queue 队列实现线程间通信。

1.2K40

基于TCP协议的Socket通信

上节中我们给大家接触了Socket的一些基本概念以及使用方法,相信大家对Socket已经有了初步的掌握。本节我们学习使用Socket来实现大文件的断点续传!...在这里我们以他人的案例进行讲解,这是别人写好的一个Socket上传大文件的例子,不要求我们自己可以写出来,需要的时候会用就好!...1.运行效果图 1.先把我们编写好的Socket服务端运行起来 2.将一个音频文件放到SD卡根目录下 3.运行我们的客户端 4.上传成功后可以看到我们的服务端的项目下生成一个file的文件夹,我们可以在这里找到上传的文件...: socket管理与多线程管理类: FileServer.java: public class FileServer { private ExecutorService executorService...,采用线程池管理每一个用户的连接请求 executorService.execute(new SocketTask(socket)); } catch

28320
  • 14.11 Socket 基于时间加密通信

    在之前的代码中我们并没有对套接字进行加密,在未加密状态下我们所有的通信内容都是明文传输的,这种方式在学习时可以使用但在真正的开发环境中必须要对数据包进行加密,此处笔者将演示一种基于时间的加密方法,该加密方法的优势是数据包每次发送均不一致...,但数据包内的内容是一致的,当抓包后会发现每次传输的数据包密文是随机变化的,但内容始终保持一致,也就是说两个拥有相同内容的数据被加密后,数据包密文不同,其主要运用了基于当前时间戳的通信机制。...14.11.1 实现加盐函数 加盐函数此处笔者采用基于时间的加盐方式,取出用户分钟数与秒数并生成随机数作为盐,通过三者的混合计算出一串解密密钥对,此方法的必须保证服务端与客户端时间同步,如果不同步则无法计算出正确的密钥对...endl; std::cout << std::endl; return pack->Buffer; } } 14.11.4 数据加密收发 当有了上述完整加解密函数的封装之后读者就可以通过使用套接字的方法来实现数据包的通信...针对服务端的主函数如下所示; int main(int argc, char* argv[]) { WSADATA WSAData; SOCKET sock, msgsock;

    35820

    Socket通信(二)、基于Qt的UDP传输设计

    8.2 UDP通信过程 首先,UDP通信是无连接的,虽然不可靠但是传输效率高,UDP就像是写信,知道地址即可,TCP就像是打电话,确保目标正确。...在UDP服务器端,通信套接字直接绑定,如果对方发数据,套接字自动触发readyRead(),发是通过槽函数实现。...在UDP客户端,通信套接字直接绑定,如果对方发数据,套接字自动触发readyRead(),发是通过槽函数实现。...实际上,UDP并不着重区分客户端与服务器端,两者都是只需要一个通信套接字,并不需要监听,当通信套接字的readyRead信号有效之后自动读取。...读取: 首先是获取发送方的IP地址,通过通信套接字中的readDatagram()函数来实现,传入的参数: qint64 QUdpSocket::readDatagram(char*data, qint64

    1.7K20

    用Python和GUI实现Socket多线程通信方案

    下面是一个使用 Python 和 Tkinter GUI 库实现 Socket 多线程通信的简单示例。在这个示例中,我是创建了一个简单的聊天应用,其中服务器和客户端可以通过 Socket 进行通信。...通过使用一些打印语句进行调试,开发者认为错误可能出现在以下代码片段中:self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.sock.connect...,连接到一个本地运行的服务器脚本,并创建一个单独的线程来收集来自服务器脚本的所有传入数据。...= socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.connect(("localhost", 5005))​...每当有客户端连接时,服务器端会创建一个新的线程来处理该客户端的通信。客户端通过输入文本框来发送消息,同时接收来自服务器端和其他客户端的消息。

    25810

    基于Tcp协议的简单Socket通信实例(JAVA)

    基于TCP协议Socket服务端和客户端的通信模型: Socket通信步骤:(简单分为4步) 1.建立服务端ServerSocket和客户端Socket 2.打开连接到Socket的输出输入流...,若要实现多客户端操作,需要涉及到多线程,只要你把每个接收到的Socket对象单独开一条线程操作,然后用一个死循环while(true)去监听端口就行,这边直接给代码了 线程操作类:SocketThread.java...; /** * Socket多线程处理类 用来处理服务端接收到的客户端请求(处理Socket对象) */ public class SocketThread extends Thread {...} catch (IOException e) { e.printStackTrace(); } } } 这里只是抛砖引玉,在实际开发中,基于...Socket编程,一般传递的并非字符串,很多情况下是对象,我们可以使用ObjectOutputStream将输出流对象序列化。

    1.3K60

    基于Tcp协议的简单Socket通信实例(JAVA)

    基于TCP协议Socket服务端和客户端的通信模型: Socket通信步骤:(简单分为4步) 1.建立服务端ServerSocket和客户端Socket 2.打开连接到Socket的输出输入流 3.按照协议进行读写操作...,若要实现多客户端操作,需要涉及到多线程,只要你把每个接收到的Socket对象单独开一条线程操作,然后用一个死循环while(true)去监听端口就行,这边直接给代码了 线程操作类:SocketThread.java...; /** * Socket多线程处理类 用来处理服务端接收到的客户端请求(处理Socket对象) */ public class SocketThread extends Thread {...} catch (IOException e) { e.printStackTrace(); } } } 这里只是抛砖引玉,在实际开发中,基于...Socket编程,一般传递的并非字符串,很多情况下是对象,我们可以使用ObjectOutputStream将输出流对象序列化。

    1.2K30

    MFC实现的Socket通信

    MFC实现的Socket通信     过五一准备休息两天,正好有朋友要来西安,我也能在西安周边转转,毕竟在这上大学居然还没有好好逛过。所以放假之前的一个晚上我发篇文章。     ...socket是什么?socket相当于通信的一个管道,m_SockListen是一个监听的socket。我们一会就要监听这根"管道",看是否有客户端连接。...accept函数就返回一个socket,这个socket就是和该客户端通信的"管道"。传入的参数和bind类似,只是第二个变成得到客户端的IP与端口了。 6.    ...----     这就是服务端socket的代码,通信的部分我客户端里介绍,服务端和客户端基本是一样的,大家可以自己看代码比较。    ...----     我只讲了这两个程序中很少的代码,跳过了一些很重要的内容:异步IO模型、多线程等,大家自己看看程序,以后我再把这些内容完整的讲一下。

    1.2K41

    Linux下Socket编程(二)——多线程封装简介

    简介 客户端连接后放到线程中运行 Socket相关代码封装 C++线程 这里使用c++11标准的线程库。 #include 编译时候出现 ?...thread_1.png 根据错误提示编译命令后加入-std=c++0x即可,对于使用的线程需要引入库-lpthread 线程使用 线程的调用我们定义一个SocketThread类来进行 SocketThread...* st=new SocketThread(connfd); thread t(&SocketThread::run,st); t.detach(); 然后我们将数据读取的方法放到SocketThread...使用了命名空间中的bind。这里需要是用全局的bind方法::bind即可。...Socket相关类封装 这里我们将客户端和服务的的操作封装到一个类XTcp中,服务的接受连接后,生成一个新的Tcp对象,并将指针返回,然后线程类XThread持有XTcp的指针。

    1.2K30

    linux c++进程间通信_c++多线程通信

    Linux下可以通过pthread_mutex_t 定义互斥体机制完成多线程的互斥操作,该机制的作用是对某个需要互斥的部分,在进入时先得到互斥体,如果没有得到互斥体,表明互斥部分被其它线程拥有,此时欲获取互斥体的线程阻塞...4.实例   下面我们还是以名的生产者/消费者问题为例来阐述Linux线程的控制和通信。一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。...线程类比   目前为止,笔者已经创作了《基于嵌入式操作系统VxWorks的多任务并发程序设计》(《软件报》2006年5~12期连载)、《深入浅出Win32多线程程序设计》(天极网技术专题)系列,我们来找出这两个系列文章与本文的共通点...看待技术问题要瞄准其本质,不管是Linux、VxWorks还是WIN32,其涉及到多线程的部分都是那些内容,无非就是线程控制和线程通信,它们的许多函数只是名称不同,其实质含义是等价的,下面我们来列个三大操作系统共同点详细表单...下多线程的控制及线程间通信编程方法,给出了一个生产者/消费者的实例,并将Linux的多线程与WIN32、VxWorks多线程进行了类比,总结了一般规律。

    3.8K10

    linux下多线程通信(一)「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。 在linux下进行多线程编程,肯定会涉及到线程通信问题,本文主要分析pipe,即管道在多线之间通信实现。...参数数组包含pipe使用的两个文件的描述符。...输出见下: 可见,输出与设想的一致,只是此时通信只是单向,如果要实现双向,最简单的办法就是再创建一组pipe,实现pipe_1_d.c如下: #include #include...进程之间的通信,推荐一种方式使用共享内存,共享内存区是最快的IPC形式,此种方式也可在两个完全独立的程序之间进行数据传递,后续再详细介绍。...当然,进程以及线程之间的通信不止以上方法,还有使用socket,eventfd等。

    1.1K40
    领券