TCP并发服务器(进程、线程、select)

一个好的服务器,一般都是并发服务器(同一时刻可以响应多个客户端的请求)。并发服务器设计一般有多进程服务器、多线程服务器、I/O复用服务器等。

一、进程版本

在这里插入图片描述

优点:父子进程资源独立,某个进程结束,不会影响已有的进程,服务器更加稳定。
缺点:消耗资源大

demo:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/************************************************************************
函数名称: void main(int argc, char *argv[])
函数功能: 主函数,用进程建立一个TCP Echo Server
函数参数: 无
函数返回: 无
************************************************************************/


int main(int argc, char *argv[])
{
   
	unsigned short port = 8080; // 本地端口
	//1.创建tcp套接字
	int sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if(sockfd < 0)
	{
   
		perror( "socket");
		exit( -1);
	}
		
	//配置本地网络信息
	struct sockaddr_in my_addr;
	bzero(&my_addr, sizeof(my_addr)); // 清空
	my_addr.sin_family = AF_INET; // IPv4
	my_addr.sin_port = htons(port); // 端口
	my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // ip

	//2.绑定bind
	int err_log = bind(sockfd, ( struct sockaddr*)&my_addr, sizeof(my_addr));
	if( err_log != 0)
	{
   
		perror( "binding");
		close(sockfd);
		exit( -1);
	}
	
	//3.监听listen
	err_log = listen(sockfd, 10);
	if(err_log != 0)
	{
   
		perror( "listen");
		close(sockfd);
		exit( -1);
	}
	
	while( 1) //主进程 循环等待客户端的连接
	{
   
		char cli_ip[INET_ADDRSTRLEN] = {
   0};		//INET_ADDRSTRLEN定义为16
		struct sockaddr_in client_addr;
		socklen_t cliaddr_len = sizeof(client_addr);
		// 取出客户端已完成的连接
		int connfd = accept(sockfd, ( struct sockaddr*)&client_addr, &cliaddr_len);
		if(connfd < 0)
		{
   
			perror( "accept");
			close(sockfd);
			exit( -1);
		}
		
		//创建fork
		pid_t pid = fork();
		if(pid < 0)
		{
   
			perror( "fork");
			_exit( -1);
		} 
		
		//子进程 接收客户端的信息,并发还给客户端
		else if( 0 == pid)   
		{
    
			/*关闭不需要的套接字可节省系统资源,
			  同时可避免父子进程共享这些套接字
 	   
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值