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();
        }

    }

}   
相关文章
|
13天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
14天前
|
安全 Linux 虚拟化
网络名称空间在Linux虚拟化技术中的位置
网络名称空间(Network Namespaces)是Linux内核特性之一,提供了隔离网络环境的能力,使得每个网络名称空间都拥有独立的网络设备、IP地址、路由表、端口号范围以及iptables规则等。这一特性在Linux虚拟化技术中占据了核心位置🌟,它不仅为构建轻量级虚拟化解决方案(如容器📦)提供了基础支持,也在传统的虚拟机技术中发挥作用,实现资源隔离和网络虚拟化。
网络名称空间在Linux虚拟化技术中的位置
|
14天前
|
网络协议 安全 Linux
Linux网络名称空间之独立网络资源管理
Linux网络名称空间是一种强大的虚拟化技术🛠️,它允许用户创建隔离的网络环境🌐,每个环境拥有独立的网络资源和配置。这项技术对于云计算☁️、容器化应用📦和网络安全🔒等领域至关重要。本文将详细介绍在Linux网络名称空间中可以拥有的独立网络资源,并指出应用开发人员在使用时应注意的重点。
|
14天前
|
安全 网络协议 Linux
Linux网络名称空间概述
Linux网络名称空间是操作系统级别的一种虚拟化技术🔄,它允许创建隔离的网络环境🌐,使得每个环境拥有自己独立的网络资源,如IP地址📍、路由表🗺️、防火墙规则🔥等。这种技术是Linux内核功能的一部分,为不同的用户空间进程提供了一种创建和使用独立网络协议栈的方式。本文旨在全方面、多维度解释Linux网络名称空间的概念、必要性和作用。
Linux网络名称空间概述
|
22天前
|
Linux C++
LInux下Posix的传统线程示例
LInux下Posix的传统线程示例
19 1
|
22天前
|
Linux
Linux中centos桌面消失网络图标
Linux中centos桌面消失网络图标
13 0
|
12天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
37 6
|
3天前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。
|
15天前
|
网络协议 Linux
在Linux中,管理和配置网络接口
在Linux中管理网络接口涉及多个命令,如`ifconfig`(在新版本中被`ip`取代)、`ip`(用于网络设备配置)、`nmcli`(NetworkManager的CLI工具)、`nmtui`(文本界面配置)、`route/ip route`(处理路由表)、`netstat/ss`(显示网络状态)和`hostnamectl/systemctl`(主机名和服务管理)。这些命令帮助用户启动接口、设置IP地址、查看连接和路由信息。不同发行版可能有差异,建议参考相应文档。
19 4
|
22小时前
|
安全 Ubuntu Linux
Linux 网络操作命令Telnet
Linux 网络操作命令Telnet
4 0
Linux 网络操作命令Telnet