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就可以同时处理多个客户的请求。

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

相关文章推荐

Liunx网络编程函数详解

  • 2013年01月05日 00:03
  • 72KB
  • 下载

liunx网络编程

  • 2006年02月23日 09:05
  • 23KB
  • 下载

Linux网络编程9 -- 简单总结Select改善多进程并发服务器

一、多进程处理方式 在生成连接套接字的同时创建新的进程,用于处理该套接字的相应操作。 原进程继续连接生成新的套接字,从而相互不影响,并发执行。   pid_t pid;     while (1)...
  • YZC1078
  • YZC1078
  • 2017年11月09日 15:46
  • 4

liunx C 网络编程

  • 2009年07月14日 18:14
  • 1KB
  • 下载

高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少

前言 曾几何时我们还在寻求网络编程中C10K问题(有关C10K问题请见文章《The C10K problem(英文在线阅读、英文PDF版下载、中文译文)》)的解决方案,但是现在从硬件和操作系统支...

网络编程释疑之:单台服务器上的并发TCP连接数可以有多少

曾几何时我们还在寻求网络编程中C10K问题的解决方案,但是现在从硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了。 我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应...

Windows下的网络编程(tcp循环并发服务器)

学了Windows下的网路编程,做了一个小例子试了下手,和Linux下的网路编程感觉总体上差不多,但是细节上,比如说函数的实现还是有些不同。总的结构和Linux差不多,如下图所示: 话不多说...

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

并发服务器:       (1)多进程并发服务器:http://blog.csdn.net/songshimvp1/article/details/51819765                  ...

UNIX网络编程笔记(3):简单的并发服务器

上一讲中的简单时间获取服务器是一个迭代服务器,对于获取时间来说够用了。迭代服务器有这样的特点:同一时间只能给一个客户服务。也就是说,如果某一时刻服务器与某个客户正在连接,其它客户必须等到上一个客户与服...

Linux网络编程——tcp并发服务器(poll实现)

想详细彻底地了解poll或看懂下面的代码请参考《Linux网络编程——I/O复用之poll函数》 代码: [csharp] view plain copy ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Liunx网络编程---并发服务器
举报原因:
原因补充:

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