基于 TCP 协议的并发服务器程序

2024-06-14 05:18

本文主要是介绍基于 TCP 协议的并发服务器程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

服务端:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <netdb.h>
#include <pthread.h>//线程执行函数,负责读写
void *thr_fn ( void *arg )
{int size, j;char recv_buf[1024];int *parg = ( int * ) arg;int new_fd = *parg;while ( ( size = read ( new_fd, recv_buf, sizeof ( recv_buf ) ) ) > 0 ) {if ( recv_buf[0] == '@' ) {break;}printf ( "Message from client(%d): %s\n", size, recv_buf );for ( j = 0; j < size; ++j )recv_buf[j] = toupper(recv_buf[j]);write(new_fd,recv_buf,size);}close(new_fd);return 0;
}int main(int argc, char *argv[]){socklen_t clt_addr_len;int listen_fd;int com_fd;int ret;int i;static char recv_buf[1024];int len;int port;pthread_t tid;struct sockaddr_in clt_addr;struct sockaddr_in srv_addr;//服务器端运行时要给出端口信息,该端口为监听端口if(argc != 2){printf("Usage:%s port\n",argv[0]);return -1;}//获得输入的端口port = atoi(argv[1]);//创建套接字用于服务器的监听listen_fd = socket(PF_INET,SOCK_STREAM,0);if(listen_fd < 0){perror("cannot create listening socket");return -1;}//填充关于服务器的套接字信息memset(&srv_addr,0,sizeof(srv_addr));srv_addr.sin_family = AF_INET;srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);srv_addr.sin_port = htons(port);//将服务器和套接字绑定ret = bind(listen_fd,(struct sockaddr *)&srv_addr,sizeof(srv_addr));if(ret == -1){perror("cannot bind server socket");close(listen_fd);return -1;}//监听指定端口ret = listen(listen_fd,5);if(ret == -1){perror("cannot listen the client connect request");close(listen_fd);return -1;}/*对每个连接来的客户端创建一个线程,单独与其进行通信,首先调用 read 函数读取客户端发送来的信息将其转化成大写后发送回客户端当输入"@"时,程序退出*/while(1){len = sizeof(clt_addr);com_fd = accept(listen_fd,(struct sockaddr *)&clt_addr,&len);if(com_fd < 0){if(errno == EINTR)continue;else{perror("cannot accept client connect request");close(listen_fd);return -1;}}printf("com_fd = %d\n",com_fd); //打印建立连接的客户端产生的套接字if((pthread_create(&tid,NULL,thr_fn,&com_fd)) == -1){perror("pthread_create error");close(listen_fd);close(com_fd);return -1;}}return 0;
}

客户端:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netdb.h>
#include <unistd.h>int main(int argc, char**argv){int connect_fd;int ret;char snd_buf[1024];int i;int port;int len;static struct sockaddr_in srv_addr;//客户端运行需要给出具体的连接地址和端口if(argc != 3){printf("Usage: %s server_ip_address port\n",argv[0]);return -1;}//获得输入的端口port = atoi(argv[2]);//创建套接字用于客户端的连接connect_fd = socket(PF_INET,SOCK_STREAM,0);if(connect_fd < 0){perror("cannot create communication socket");return 1;}//填充关于服务器的套接字信息memset(&srv_addr,0,sizeof(srv_addr));srv_addr.sin_family = AF_INET;srv_addr.sin_addr.s_addr = inet_addr(argv[1]);srv_addr.sin_port = htons(port);//连接指定的服务器ret = connect(connect_fd,(struct sockaddr *)&srv_addr,sizeof(srv_addr));if(ret == -1){perror("cannot connect to the server");close(connect_fd);return -1;}memset(snd_buf,0,1024);/*用户输入信息后,程序将输入的信息通过套接字发送给服务器,然后调用read函数从服务器中读取发送来的信息当输入"@"时,程序退出*/while(1){write(STDOUT_FILENO,"input message:", 14);len = read(STDIN_FILENO,snd_buf,1024);if(len > 0)write(connect_fd,snd_buf,len);len = read(connect_fd,snd_buf,len);if(len > 0)printf("Message form server: %s\n",snd_buf);if(snd_buf[0] == '@')break;}close(connect_fd);return 0;
}



这篇关于基于 TCP 协议的并发服务器程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1059482

相关文章

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

高并发环境中保持幂等性

在高并发环境中保持幂等性是一项重要的挑战。幂等性指的是无论操作执行多少次,其效果都是相同的。确保操作的幂等性可以避免重复执行带来的副作用。以下是一些保持幂等性的常用方法: 唯一标识符: 请求唯一标识:在每次请求中引入唯一标识符(如 UUID 或者生成的唯一 ID),在处理请求时,系统可以检查这个标识符是否已经处理过,如果是,则忽略重复请求。幂等键(Idempotency Key):客户端在每次