Liunx网络编程---并发服务器

原创 2013年12月05日 15:04:00

网络程序里面,一般来说都是许多用户共同访问一个服务器,为了处理客户的需求,对服务器提出了特殊的要求,目前有两种;

      循环服务器:

           服务器在同一时刻只能处理一个客户请求

      并发服务器;

           服务器能在同一时刻能够处理多个用户的请求

网络服务器大多采用并发,并发服务器的原理就是专门制造一个子进程,由子进程负责处理客户端的请求,父进程继续等待新的客户请求。下面是将TCP循环服务器改进的并发服务器:

//TCP text,this is a TCP server
#include <stdio.h>
#include <errno.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#define portnumber 4443

int main()
{
	struct sockaddr_in TCP_server,TCP_client;
	int socketfd,newfd;
	int tbyte;
	if((socketfd = socket(AF_INET,SOCK_STREAM,0)) == -1)	
	{
		fprintf(stderr,"Get socket error! %s \n",strerror(errno));
		exit(1);
	}
	printf("set up the socket,and sockfd is %d\n",socketfd);
	
	/*write the server address*/
	bzero(&TCP_server,sizeof(struct sockaddr_in));
	TCP_server.sin_family = AF_INET;
	TCP_server.sin_port = htons(portnumber);
	TCP_server.sin_addr.s_addr = htonl(INADDR_ANY);
	/*bind ip to socket*/
	if(bind(socketfd,(struct sockaddr *)(&TCP_server),sizeof(struct sockaddr)) == -1)
	{
		perror("Bind error:\n");
		exit(1);
	}
	if(listen(socketfd,5) == -1)
	{
		printf("set the max connect error!\n");
		exit(1); 
	}
	while(1)
	{
		bzero(&TCP_client,sizeof(struct sockaddr_in));
		tbyte = sizeof(struct sockaddr_in);	
		if((newfd = accept(socketfd,(struct sockaddr*)(&TCP_client),&tbyte)) == -1)
		{
			fprintf(stderr,"TCP connect failed: %s\n",strerror(errno));
			exit(1);
		}
		/*create a child progress to solve the telecommuncation*/
		if(fork() == 0)			//child progross
		{	
			char buffer[1024];		
			printf("Get message from: %s\n",inet_ntoa(TCP_client.sin_addr));
			if((tbyte = read(newfd,buffer,1024)) == -1)
			{
				printf("Get message error!\n");
				exit(1);
			}
			buffer[tbyte] = '\0';
			printf("%s\n",buffer);
			memset(buffer,'\0',1024);
			close(newfd);
			close(socketfd);
			exit(0);
		}else	//parents progress
		{
			close(newfd);
		}
	}
	return 0;
}
如上,改进后的TCP_server就可以同时处理多个客户的请求。

版权声明:本文为博主原创文章,未经博主允许不得转载。

高性能网络编程5--IO复用与并发编程

开发基于TCP协议的高性能服务器时,能够处理的并发连接数是一个重要指标。为了实现高并发,前辈们在开发效率与执行效率上的不同权衡下,提供了多种实现方式。IO多路复用,这是最纯正、本质的方法,它也是追求执...
  • russell_tao
  • russell_tao
  • 2013年12月04日 15:57
  • 24168

Linux 网络编程——并发服务器的三种实现模型

服务器设计技术有很多,按使用的协议来分有 TCP 服务器和 UDP 服务器,按处理方式来分有循环服务器和并发服务器。循环服务器与并发服务器模型在网络程序里面,一般来说都是许多客户对应一个服务器(多对一...
  • tennysonsky
  • tennysonsky
  • 2015年05月12日 17:40
  • 82708

网络编程中设计并发服务器,使用多进程与多线程有什么区别?

网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别? 答案一: 1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。 2,线程:相对与进程而言,线程是一个更加接...
  • laoniu_c
  • laoniu_c
  • 2014年09月23日 19:07
  • 1929

C++ 网络编程 阻塞I/O模型并发回显服务器

#include #include using namespace std; #pragma comment(lib,"Ws2_32.lib") const int nPort=10000; cons...
  • riyuedangkong1
  • riyuedangkong1
  • 2016年06月20日 11:59
  • 539

UNIX网络编程——并发服务器(I/O复用)

I/O复用型并发服务器:I/O复用是用来解决。         在这篇文章http://blog.csdn.net/songshimvp1/article/details/51819765中,介绍了多...
  • songshiMVP1
  • songshiMVP1
  • 2016年07月07日 10:24
  • 667

Linux网络编程——tcp并发服务器(多线程)

tcp多线程并发服务器 多线程服务器是对多进程服务器的改进,由于多进程服务器在创建进程时要消耗较大的系统资源,所以用线程来取代进程,这样服务处理程序可以较快的创建。据统计,创建线程与创建进程要快 ...
  • lianghe_work
  • lianghe_work
  • 2015年06月15日 15:27
  • 8261

TCP/IP网络编程 学习笔记_13 --基于I/O复用的服务端

前言:前面我们讲了多进程的并发服务端,只要有客服端连接请求就会创建新进程,这虽然也是一种解决方案,但创建进程是需要付出极大代价的,这需要大量运算和内存空间,而且每个进程间具有独立的内存空间,所以相互间...
  • u010223072
  • u010223072
  • 2015年08月31日 17:58
  • 1308

高并发服务器编程之多线程并发服务器

同类文章: 基于Linux的SOCKET编程之TCP半双工Client-Server聊天程序 基于Linux的Socket编程之TCP全双工Server-Client聊天程序 高并发服务...
  • Apollon_krj
  • Apollon_krj
  • 2017年02月28日 20:38
  • 863

Linux网络编程——tcp并发服务器(多进程)

一、tcp并发服务器概述 一个好的服务器,一般都是并发服务器(同一时刻可以响应多个客户端的请求)。并发服务器设计技术一般有:多进程服务器、多线程服务器、I/O复用服务器等。 二、多...
  • lianghe_work
  • lianghe_work
  • 2015年06月15日 15:02
  • 4843

关于高并发服务器的listen函数参数设置

int listen(int fd, int backlog); socket系统调用listen只被tcp 服务器使用,他做两件事: 1. 将未链接的套接口转换为被动套接口,指示内核接受...
  • qq_21794823
  • qq_21794823
  • 2016年10月31日 17:12
  • 375
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Liunx网络编程---并发服务器
举报原因:
原因补充:

(最多只允许输入30个字)