网络编程-tcp多客户端编程-多进程(6)

C语言网络编程-tcp服务器实现 C语言网络编程-tcp服务器实现,让大家对网络编程有了解! 阅读详情

在前面的章节中讲到的编程模型中,和服务器通信的客户端最多只有一个,但是在实际应用场景中,大部分情况同时和服务器通信的客户端不止一个,因此需要用到其他技术来解决多客户端请求并发的问题。有三种方法来解决这个问题:
一、多进程模型
二、多线程模型
三、io多路复用技术
(1)多进程模型中,服务器接收到一个客户端连接请求时,然后创建一个进程,用子进程和客户端通信。通信结束后,父进程回收子进程资源即可。
(2)多线程模型中,服务器收到一个客户端连接请求时,然后创建一个线程,用子线程和客户端通信。通信结束后,父线程回收子线程的资源即可。
(3)io多路复用技术中,在linux系统常见的复用模型有select,poll,epoll。
多线程以及io多路复用后面的章节在详细介绍,下面贴出多进程模型的代码:

#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <resolv.h>
#include <sys/time.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/types.h>

const int MAXBUF = 1024;
const unsigned int MAXACCEPT = 2000;

//创建监听用的socket,传入监听的端口,
int tcpSocket(int port)
{
        int socketfd = socket(AF_INET, SOCK_STREAM, 0);
        struct sockaddr_in src;
        src.sin_family = AF_INET;
        src.sin_port = htons(port);
        src.sin_addr.s_addr = INADDR_ANY;
        memset(src.sin_zero, 0, sizeof(src.sin_zero));
        int ret = 0;
        ret = bind(socketfd, (struct sockaddr *)&src, sizeof(struct sockaddr_in));
        if (ret != 0)
        {
                printf("bind failed ret = %d\n", ret);
                close(socketfd);
                socketfd = 0;
                return 0;
        }
        listen(socketfd, 10000);
        return socketfd;
}

void sigHandler(int sig)
{
        // ctrl+c信号
        if(sig == SIGINT)
        {

        }
        // 子进程结束信号,父进程调用wait(0)回收资源
        if(sig == SIGCHLD)
        {
                wait(0);
        }
}

// 子进程通信函数,参数为通信socket
void socketProcess(int fd)
{
        char tmpStr[MAXBUF] = {0};
        while(1)
        {
                int ret = recv(fd, tmpStr, sizeof(tmpStr), MSG_DONTWAIT);
                if((ret < 0) && ((errno == EINTR) || (errno == EWOULDBLOCK) || (errno == EAGAIN)))
                {
                        continue;
                }
                else if(ret > 0)
                {
                        sprintf(tmpStr, "%s hello server: %s", tmpStr, __TIME__);
                        send(fd, tmpStr, sizeof(tmpStr), MSG_DONTWAIT);
                }
                else
                {
                        printf("close socket = %d\n", fd);
                        close(fd);
                        break;
                }
                memset(tmpStr, 0, sizeof(tmpStr));
        }
}

int main()
{
        //const int N = 1;
        int array;
        array = tcpSocket(10567);
        if (array == 0)
        {
                printf("bind failed\n");
        }

        signal(SIGINT, sigHandler);
        signal(SIGCHLD, sigHandler);

        int i = 0;
        while (1)
        {
                struct sockaddr dst;
                i++;
                unsigned int sockaddrLen = sizeof(struct sockaddr);

                int connectfd = accept(array, &dst, &sockaddrLen);
                if (connectfd <= 0)
                {
                        continue;
                }
                // 和客户端连接成功,创建子进程来处理和客户端的通信。
                pid_t pid = fork();
                if(pid < 0)
                {
                        printf("fork failed\n");
                        continue;
                }
                else if(pid == 0)
                {
                        socketProcess(connectfd);
                        break;
                }
                else 
                {
                        //通信socket被复制到父进程和子进程,子进程负责和客户端通信,则父进程中的socket需要关闭掉。
                        close(connectfd);
                }
        }
        return 0;
}
C++后端开发--网络编程基础 HTTP(HyperText Transfer Protocol,超文本传输协议)是用于分布式、协作和超媒体信息系统的应用层协议,是万维网数据通信的基础。HTTP起初由蒂姆·伯纳斯-李(Tim Berners-Lee)为万维网设计,现由互联网工程任务组(IETF)和万维网联盟(W3C)共同维护。HTTP协议定义了浏览器(客户端)与Web服务器之间的通信规则。网络编程是后端开发中的重要技能,掌握基础概念和Socket编程方法是深入学习和实践的第一步。 阅读详情

相关推荐

基于TCP实现服务器端、多客户端通信(多线程、多进程并发编程)

多客户端并发访问的问题分析、多线程方式实现客户端并发访问、多进程方式实现客户端并发访问、解决多进程方式下僵尸进程问题

ZY-JIMMY 7538

网络编程:C语言实现TCP并发服务器(多进程、多线程)

在多线程TCP服务器中,服务器进程会创建多个线程来处理客户端连接请求。对于每个客户端连接请求,服务器进程会创建一个新的线程去处理,各个线程之间相互独立,能够同时处理多个客户端连接请求。在多进程TCP服务器中,服务器进程会创建多个子进程来处理客户端连接请求。对于每个客户端连接请求,服务器进程会创建一个新的子进程去处理,各个子进程之间相互独立,能够同时处理多个客户端连接请求。在一个TCP并发服务器中,服务器进程通常会创建多个子进程或子线程来处理客户端连接请求,从而实现并发处理。2.多线程TCP服务器。

SYF_wdnmd的博客 2447

Windows平台TCP通信实战:服务端与多客户端Socket编程

网络编程是一种允许两个程序之间通过网络进行通信的技术,而Socket(套接字)则是实现这一功能的基础。Socket API提供了一组函数,用于创建网络通信的端点,并通过这些端点发送和接收数据。在IT领域中,网络编程是构建分布式系统的关键技术之一。在Windows环境下,服务端程序通常运行在一种特殊的执行环境中,即服务(Service)。服务端架构的设计至关重要,它决定了程序的整体行为和性能表现。一个典型的服务端程序模型可以划分为以下几个核心组成部分:监听器(Listener)

weixin_35815766的博客 1010

计算机网络知识详解之:TCP连接原理详解

计算机网络知识详解之:TCP连接原理详解

大数据开发、JAVA开发、人工智能AI 9023

Qt 6.12 单服务器多客户端网络编程实战项目

Qt是一个跨平台的C++框架,它提供了一套完备的网络编程模块,允许开发者在应用程序中实现复杂的网络通信功能。Qt网络模块提供了对TCP/IP和UDP协议的高级封装,简化了网络编程的复杂性,允许开发者快速构建客户端和服务器应用。Qt 中的信号和槽机制是其事件处理的核心概念,它提供了一种松耦合的方式来进行对象间的通信。信号是在类的内部声明的一种特殊的函数,当事件发生时(如按钮点击或数据接收),它可以被发射。槽函数则类似于常规的成员函数,它们能够响应信号并进行操作。

weixin_42372837的博客 1139

基于TCP/IP的简单局域网聊天程序

一个基于TCP/IP的简单聊天程序,包括控制台的服务器以及基于MFC的客户端程序,服务器的IP地址只需在配置文件里面配置即可,无需手动输入,而且方面在不同的机器上使用。客户端只需配置好了配置文件,连接后即可与其他客户端进行群聊

TCP服务器一个端口号可以有多个连接

这是我在讨论区看到的一个回答,写的很好,让我明白了为什么单个服务器程序可承受最大连接数可以达到几十W 要写网络程序就必须用Socket,这是程序员都知道的。而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,write等几个基本的操作。是的,就跟常见的文件操作一样,只要写过就一定知道。 对于网络编程,我们也言必称TCP/IP,似乎其它网络协议已经不存在了。对于TCP/IP,我们还知道TCP和UDP,前者可以保证数

Devour_的博客 1553

tcp_fork包括客户端、服务器的进程编程代码

tcp_fork包括客户端、服务器的进程编程代码

TCP/IP的多种连接情况

刚接触TCP/IP通信设计的人根据范例可以很快编出一个通信程 序,据此一些人可能会认为TCP/IP编程很简单。其实不然, TCP/IP编程具有较为丰富的内容。其编程的丰富性主要体现在 通信方式和报文格式的多样性上。一。通信方式主要有以下三大类:(一)SERVER/CLIENT方式1.一个Client方连接一个Server方,或称点对点(peer to peer): 2.多个Cl

技术资料库 3855

c语言tcp主机程序,多线程可同时连接多个客户端

c语言tcp主机程序,多线程可同时连接多个客户端,linux下socket编程。

ABAP on HANA/CDS view/AMDP 大乱炖

文章目录1. HANA的三大杀器1.1 内存式数据库1.2 多核架构1.3 列式存储1.3.1 数据压缩1.3.2 并行处理1.3.3 聚集和索引1.3.4 代码下移2. CDS 概念2.1 ABAP 开发环境2.2 OPEN SQL语句2.3 CDS 到底是啥2.4 CDS 类型2.5 创建CDS view3. CDS 实战3.1 Annotation注解3.2 Case 语句3.3 数学计算3.4 字符串表达3.5 货币转换3.6 聚集语句3.7 Join3.8 Union3.9 参数3.10 作为子C

weixin_45689053的博客 4783

c++多进程编程

c++多进程编程 介绍 进程:进程是一个正在执行的程序,是向CPU申请资源的,进程之间数据相互独立,一个进程至少有一个线程。 线程:线程是进程中的单一的顺序控制流程也可以叫做最小控制单元,线程是进程中执行单元,开启一个线程比开启一个进程更加节省资源。 多线程:多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序。一般情况下,两种类型的多任务处理:基于进程和基于线程。...

Wandering的博客 2万+

Vivado ILA抓不到低频信号?试试Capture Control模式,保姆级配置教程(附PWM调试实例)

本文详细解析了Vivado ILA的Capture Control模式在低频信号捕获中的应用,特别针对PWM调试等场景提供保姆级配置教程。通过条件采样和时间拉伸技术,有效解决传统ILA采样在低频信号调试中的存储深度不足、关键信号丢失等问题,并附赠呼吸灯PWM的完整调试实例,帮助FPGA开发者提升调试效率。

weixin_42549451的博客 349

QT TCP网络编程

首先介绍一下TCP:(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。相比而言UDP,就是开放式、无连接、不可靠的传输层通信协议。 下面,我一次进行客户端和服务器端的QT实现。我的开发环境是:QT Creator 5.7。 先看下效果图: 一:客户端编程QT提供了QTcpSocket类,可以直接实例化一个客户端,可在h

工作赚钱去旅行 1万+

浅谈云计算01 | 云计算服务的特点

在当今数字化时代,云计算作为一种强大的技术解决方案,正逐渐改变着企业和个人对信息技术的使用方式。本文将详细探讨云计算的五个主要特点,包括按需自助服务、广泛的网络接入、资源池化、快速弹性伸缩以及可计量服务。

时光札记 1119

别再乱刷了!《另一个伊甸》异节、改典、典录获取途径完全梳理,这些隐藏奖励你拿全了吗?

本文全面解析《另一个伊甸》中异节、改典、典录的获取途径,包括断章、外传、精灵试炼等高概率掉落副本,以及隐藏任务、限时活动和特殊挑战。提供高效收集策略和优先级建议,帮助玩家快速获取这些稀缺资源,实现角色真证和上限突破。

weixin_42699679的博客 589

网络编程『简易TCP网络程序』

随着数字时代的来临,TCP网络程序已成为程序员不可或缺的技术领域。本博客将带领读者深入研究,从最基础的字符串回响开始,逐步探索至多进程、多线程服务器的高级实践。我们将详细探讨每个环节的核心功能和实现细节,致力于帮助读者深刻理解网络编程的本质。通过系统学习本博客内容,读者将获得构建稳健网络应用的重要技能,更加自信地应对日益复杂的软件开发挑战。这里将为你的编程旅程提供扎实的基础和深远的启示。

北 海的博客 9910

遗传算法解整数规划IntCon

x = ga(fun,nvars,A,b,[],[],lb,ub,nonlcon,IntCon) IntCon就是代表整数的参量,描述的是哪几个自变量是0-1整数变量。比如navrs设置有4个变量,设置IntCon为[2 3],代表第2和第3个变量是整数。 再比如设置IntCon=2:2:nvars,代表偶数项的变量是整数。 值得注意的是一旦设置了非空的IntCon,则Aeqandbeqmust be an empty entry ([]), andnonlconmust re...

jianti9962的博客 9220

网络编程(IP、端口、协议、UDP、TCP)【详解】

网络编程是可以让设备中的程序与网络上其他设备中的程序进行数据交互的技术。

qq_1424674116的博客 1万+

C++(Qt)软件调试---静态分析工具clang-tidy(18)

现在很多人在开发中完全忽略了编译器、IDE的警告提示,这怎么可能写出稳定的程序。 clang-tidy是一个由LLVM项目提供的开源工具,是一个静态分析工具,用于进行静态代码分析和代码质量改进。

mahuifa的博客 5080

vue支付项目-APP支付宝支付功能

如果用户已安装支付宝客户端,商家 App 唤起支付宝完成支付,支付完后跳回到商家 App 内,最后展示支付结果。如果用户没有安装支付宝客户端,商家 App 内会调起支付宝网页支付收银台,用户登录支付宝账号,支付完后展示支付结果。1.点击按钮开通或者续费,会验证是否选择会员商品以及对协议是否查看选中(这里根据项目需要自行验证,可忽略),验证通过打开选择支付方式弹窗页面,选择微信支付或者支付宝支付;4.可取消支付,放弃支付会返回会员页面,页面提示支付取消;1.判断支付方式,如果是2,则是支付宝支付方式。

总结前端开发中遇到的问题,分享前端知识 1万+

linux 网络编程

linux系统编程-网络编程

qq_39855356的博客 5556

用 ABAP 的 AMDP 把计算推到数据库:概念、场景、以及可运行示例

摘要:AMDP(ABAP Managed Database Procedures)是SAP HANA环境下优化ABAP性能的关键技术,通过将数据计算逻辑推送到数据库端执行,减少数据传输和应用层处理开销。其核心价值在于利用HANA的集合运算能力,适用于大数据量聚合、窗口函数等复杂计算场景。AMDP不是通用解决方案,而是针对CDS无法高效处理的特定性能瓶颈的优化手段。典型应用包括财务统计、零售分析等需要高性能数据处理的业务场景。本文通过概念解析、性能逻辑推导和实际代码示例(包括直接调用的AMDP Procedu

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 261

[网络编程]TCP和UDP的比较 及 通过java用UDP实现网络编程

前面我们知道, UDP是无连接的, 所以本身并没有存储对方的ip和端口信息, 但是上述我们用来接收数据的DatagramPacket中, 存放了客户端的ip和接口, 所以我们可以通过getSocketAddress()方法来获取到。我们现在只是进行一个简单的实现, 服务器收到客户端请求后, 无需做什么, 客户端请求啥, 直接响应啥, 这种程序, 就叫做"回显"(Echo)系统中的socket, 可以理解成是一种"文件", socket文件, 可以视为是"网卡"这种硬件设备的抽象表现形式。

m0_73992740的博客 1212

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【JavaEE】网络编程——TCP

网络编程的目的是为了跨主机通信,socket==》操作系统提供的网络编程的API就称为"socket"API。

HD_13的博客 1228

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

网络编程之TCP协议

网络编程之TCP协议详解

m0_73932536的博客 1260

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 网络编程—简单的udp套接字编程(5)
下一篇: mysql的登陆和退出(1)
cppNoException
博客等级 码龄10年 11粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值