Linux网络编程之多线程

简介:

多线程模型

在多线程模型下,注意共享数据的同步,mutex/condition_variable/rw_lock等的使用,local thread storage的使用,另外,可以搭配线程池处理异步计算任务。在C++11中的线程库中已经提供了future相关的工具,合理地使用线程模型减少资源的同时,能获得不错的性能

//thread server
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netdb.h>
#include <pthread.h>
#include <unistd.h>


#define MAX_READ_CHUNK 2*1024*1024
#define KEEP_ALIVE 0
void run();

int main(int argc, char *argv[])
{
    run();
    return 0;
}

void error_exit()
{
    perror("error");
    exit(EXIT_FAILURE);
}


int do_read_and_write(int clientfd)
{
    char read[MAX_READ_CHUNK];
    ssize_t result;
    result = recv(clientfd, read, sizeof(read), 0);
    if (result<=0){
        perror("error recv data");
        return -1;
    }

    //write back
    result = send(clientfd, read, result, 0);

    if (result<=0){
        perror("error send data");
        return -1;
    }

    if(!KEEP_ALIVE)
        close(clientfd);
    return 0;
}

void *handle_client_socket(void *clientfd)
{
    if (pthread_detach(pthread_self())!=0){
        error_exit();
    }
    int client = *(int *)clientfd;
    if (clientfd!=NULL){
        free(clientfd);
        clientfd = NULL;
    }
    if (do_read_and_write(client)<0){
        error_exit();
    }
    //we set the thread detach,so no need call pthread_exit
    //pthread_exit(NULL);
}


void run()
{
    struct hostent *h;
    h = gethostbyname("localhost");
    if (!h){
        error_exit();
    }

    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_addr = *(struct in_addr*)h->h_addr;
    sin.sin_port = htons(8000);

    int serverfd = socket(AF_INET, SOCK_STREAM, 0);
    if (serverfd<0){
        error_exit();
    }
    int reuse = 1;
    if (setsockopt(serverfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))){
        error_exit();
    }

    socklen_t slen = sizeof(sin);
    if (bind(serverfd, (struct sockaddr *)&sin, slen)<0){
        error_exit();
    }

    if (listen(serverfd, 20)<0){
        error_exit();
    }

    struct sockaddr_in client;
    socklen_t slen_client = sizeof(client);
    int clientfd;
    pthread_t pt;

    while(1){

        clientfd = accept(serverfd, (struct sockaddr *)&client, &slen_client);
        if (clientfd<0){
            error_exit();
        }

        int *temp = (int *) malloc(sizeof(int));
        *temp = clientfd;
        if(pthread_create(&pt, NULL, handle_client_socket, temp)!=0){
            error_exit();
        }

    }

}   
相关文章
|
6月前
|
负载均衡 算法 安全
基于Reactor模式的高性能网络库之线程池组件设计篇
EventLoopThreadPool 是 Reactor 模式中实现“一个主线程 + 多个工作线程”的关键组件,用于高效管理多个 EventLoop 并在多核 CPU 上分担高并发 I/O 压力。通过封装 Thread 类和 EventLoopThread,实现线程创建、管理和事件循环的调度,形成线程池结构。每个 EventLoopThread 管理一个子线程与对应的 EventLoop(subloop),主线程(base loop)通过负载均衡算法将任务派发至各 subloop,从而提升系统性能与并发处理能力。
370 3
|
3月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
236 1
|
3月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
250 1
|
4月前
|
安全 Linux 网络安全
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
147 0
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
|
5月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
361 18
|
5月前
|
网络协议 关系型数据库 Linux
【App Service Linux】在Linux App Service中安装 tcpdump 并抓取网络包
在App Service for Linux环境中,无法像Windows一样直接使用网络排查工具抓包。本文介绍了如何通过TCPDUMP在Linux环境下抓取网络包,包括SSH进入容器、安装tcpdump、执行抓包命令及下载分析文件的完整操作步骤。
277 5
|
6月前
|
Web App开发 网络协议 Linux
【Linux】网络基础
TCP/IP五层模型是网络通信的基础框架,将复杂的数据传输过程分为物理层、数据链路层、网络层、传输层和应用层,每层各司其职,协同完成远程通信。该模型确保了不同设备和网络之间的互联互通,是现代互联网运行的核心机制。
491 5
|
9月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
334 67
|
6月前
|
网络协议 Linux 开发者
深入Linux中UDP网络通信机制编程探索
以上步骤概述了Linux中UDP网络通信的编程机制。在实现时,因关注细节和上下文环境可能有所调整,但大致流程是一致的。这些知识片段旨在帮助开发者快速上手Linux下的UDP编程,并提供可靠的信息作为编程的基础。在编程实践中,应结合实际业务需求,设计合适的数据传输协议,确保数据的正确性和实时性。
180 0
|
8月前
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
243 18