1.mystery引入
  1)高性能的网络服务程序分为单线程重复式网络服务、多进程网络服务 、多线程网络服务、线程池网络服务和IO多路复用网络服务等
  2)单线程重复式是最基本的一种TCP服务模式,其实现简单,但是用户体验差,由于我前面日志中已经作过介绍,这里就不再赘述了
  3)多进程网络服务是利用Linux系统中的父子进程关系为多用户提供并发服务,基本理念是一个用户,启动一个服务进程。
   优点是方法通用,但是启动和关闭进程需要很大系统开销,不利于大量用户并发使用;
     另外父子进程间的数据共享与同步等具体实现会有一定困难。
  4)多线程网络服务类似于多进行网络服务模式,不同之处是前者是新启动一个线程,适用于商业环境中。
   5)线程池网络服务基本理念是:先创建一批资源,当有用户到来时,直接分配已创建好的资源
   目的是减少系统在频繁创建资源时的开销,优点是性能高效。
   6)IO多路复用是一种非阻塞的方式,与前面几种最大的不同是不会因为IO的操作而进入阻塞状态
     其调用Select的方式轮询各个套接字
     优点是系统开销小,不用创建和维护线程或进程队列,在Linux应用中比较多,常结合其它模式共同使用,以达到更好的效果。


2.实例演示
   1)前面我已经演示过单线程重复式网络服务和IO多路复用了,所以这次只演示多进程网络服务、多线程网络服务和线程池网络服务
   2)采用C/S模式,设计一个统一的客户端,用3种不同的模式实现服务器端
   3)要求:在客户端,用户可以通过交互的方式,进行加、减、乖、除方面的运算设置,通过网络通信将计算参数传送到服务器端,然后服务器端完成具体的计算任务,并将结果返回。
   4)通信格式设计:客户端程序整体流程是收集用户的命令信息,打包发送给服务器端,服务器端通过解析数据包,识别出主要功能,同时执行运算,并将结果返回。
   5)对于多进程网络服务程序的设计,主要是调用系统的fork()函数,这里fork()函数的返回值很重要。
   6)多线程和多进程的原理类似。
   7)线程池架构
      1)功用上设计两个模块,一个服务主调度模块和一个线程服务模块。
      2)每个线程有两个状态:空闲状态和工作状态。
      3)每个线程均有一块属于自己的公共数据区域,存放两个变量,一个标记自身状态,一个对应客户端的套接字号。
      4)有新用户到来时,系统通过查找公共数据区域,判断当前是否有空闲线程,若有则为其分配服务线程。
      5)在线程服务的线程回调函数中,index对应于线程自身的索引号,通过该索引号,线程查找自身所属的公共数据区。


3.效果演示
   1)多进程网络服务

   2)多线程网络服务      

3)线程池网络服务


4.源代码
   1)因为源代码是在linux下写的,日志是在win7下写的,复制过来有些文字乱码了,主要是因为编码方式不同,不过不影响代码的查看
   2)客户端

//client.c
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#define PORT 5555
#define SERVER_IP "127.0.0.1"
typedef struct mathopt
{
int oprate;
float value1;
float value2;
}mopt;
void createopt(struct mathopt *pMp)
{
printf("please input operand one:");
scanf("%f",&(pMp->value1));
printf("please input operand two:");
scanf("%f",&(pMp->value2));
}
void help()
{
printf("==================================================================\n");
printf("version:V1.0\n");
printf("author:mystery\n\n\n");
printf("%-12s %-12s\n","Command","Fuction");
printf("%-12s %-12s\n","add","Adder computing");
printf("%-12s %-12s\n","minus","Minus computing");
printf("%-12s %-12s\n","multiply","Multiply computing");
printf("%-12s %-12s\n","divide","Divide computing");
printf("%-12s %-12s\n","hlep","Print help information");
printf("%-12s %-12s\n","quit","Exit the program");
printf("==================================================================\n");
}
main()
{
struct sockaddr_in serverAddr;
int clientSocket;
char sendbuf[200];
char recvbuf[200];
char command[20];
if((clientSocket=socket(AF_INET,SOCK_STREAM,0)) < 0)
{
perror( "error: create socket!!!");
return -1;
}
serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(PORT);
serverAddr.sin_addr.s_addr=inet_addr(SERVER_IP);
if(connect(clientSocket,( struct sockaddr * )&serverAddr,sizeof(serverAddr)) < 0)
{
perror("error: connect remote server !!!");
exit(1);
}
printf("infor: connect with destination host........[ok]\n");
while(1)
{
printf("Input your World:>");
scanf("%s",command);
struct mathopt mp;
if(strcmp(command,"add") == 0)
{
createopt(&mp);
mp.oprate = 0;
}
else if(strcmp(command,"minus") == 0)
{
createopt(&mp);
mp.oprate = 1;
}
else if(strcmp(command,"multiply") == 0)
{
createopt(&mp);
mp.oprate = 2;
}
else if(strcmp(command,"divide") == 0)
{
while(1)
{
createopt(&mp);
if(mp.value2 == 0)
{
printf("warning: Dividend can not be 0!!!!!\n");
}
else
{
break;
}
}
mp.oprate = 3;
}
else if(strcmp(command,"help") == 0)
{
help();
continue ;
}
else if(strcmp(command,"quit") == 0)
{
mp.oprate = 4;
}
else
{
printf("error: can't identify your input !!!\n");
continue ;
}
send(clientSocket,(char *)&mp,sizeof(mp),0);
if(mp.oprate == 4)
{
break;
}
recv(clientSocket,recvbuf,200,0);
printf("the result is: %s\n",recvbuf);
}
close(clientSocket);
return 0;
}
 
 

  3)多进程服务端
   //multiprocesserver.txt,见附件

 
   4)多线程网络服务端

   //multithreadserver.txt,见附件
 
   6)线程池网络服务端
   //poolserver.txt,见附件
 
 
 

本文出自 “成鹏致远” 博客,请务必保留此出处http://infohacker.blog.51cto.com/6751239/1155167

【Socket】linux高性能网络服务程序的更多相关文章

  1. socket - Linux 套接字

    总览 #include <sys/socket.h> mysocket = socket(int socket_family, int socket_type, int protocol) ...

  2. 框架篇:见识一下linux高性能网络IO+Reactor模型

    前言 网络I/O,可以理解为网络上的数据流.通常我们会基于socket与远端建立一条TCP或者UDP通道,然后进行读写.单个socket时,使用一个线程即可高效处理:然而如果是10K个socket连接 ...

  3. linux常用服务程序一键安装

    PHP7安装 rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm service php-fpm stop yum remove php5* ...

  4. 【Socket】linux黑客之网络嗅探底层原理

      1.mystery引入 1)网络嗅探属于网络攻防类的安全软件,其基于原始套接字技术开发的 2)原始套接字是一种套接字底层技术,它工作在网络层 3)谈到网络安全,刚好本学期学过这门课程,这里myst ...

  5. 转:socket编程在windows和linux下的区别

    如无其它说明,本文所指Linux均表示2.6内核Linux,GCC编译器,Windows均表示Windows XP系统,Visual Studio 2005 sp1编译环境. 下面大概分几个方面进行罗 ...

  6. socket编程在windows和linux下的区别

    如无其它说明,本文所指Linux均表示2.6内核Linux,GCC编译器,Windows均表示Windows XP系统,Visual Studio 2005 sp1编译环境. 下面大概分几个方面进行罗 ...

  7. socket在windows下和linux下的区别

    原文:socket在windows下和linux下的区别 1)头文件 windows下winsock.h/winsock2.h linux下sys/socket.h    错误处理:errno.h 2 ...

  8. Socket程序从windows移植到linux下需要注意的

    )头文件 windows下winsock.h或winsock2.h linux下netinet/in.h(大部分都在这儿),unistd.h(close函数在这儿),sys/socket.h(在in. ...

  9. Linux网络编程--socket

    1.socket的核心思想是,作为服务器间的进程间通信的最底层的实现,常用的大部分网络协议都是基于socket实现. 2.socket 是如何与最终的低层收发包建立联系的? 3.socket 是如何与 ...

随机推荐

  1. Linux-LVS为何不能完全替代DNS轮询

    转自:链接 上一篇文章“一分钟了解负载均衡的一切”引起了不少同学的关注,评论中大家争论的比较多的一个技术点是接入层负载均衡技术,部分同学持这样的观点: 1)nginx前端加入lvs和keepalive ...

  2. (原)ubuntnu中anaconda的g++提示crtbeginS.o:unrecognized relocation

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6950263.html 自从使用anaconda后,方便是方便了,也遇到了很多蛋疼的问题. 这次使用an ...

  3. 超酷的 Vim 搜索技巧

    尽管目前我们已经涉及 Vim 的多种特性,但此编辑器的特性集如此庞大,不管我们学习多少,似乎仍然远远不足.承接我们的 Vim 教程系列,本文我们将讨论 Vim 提供的多种搜索技术. 不过在此之前,请注 ...

  4. 【java】Java泛型

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void main(Stri ...

  5. Git 配置(分布式版本控制系统)

    1.Mac Git 配置文件 既然已经在系统上安装了 Git,你会想要做几件事来定制你的 Git 环境.每台计算机上只需要配置一次,程序升级时会保留配置信息.你可以在任何时候再次通过运行命令来修改它们 ...

  6. 雷军:重刷ROM的“自我格式化”

    本文来源于:百度百家 作者:金错刀 2014-03-14 10:33:06 最近,跟一个前金山高管聊起雷军,特别是雷军的变化,她的感觉是:雷总岂止是变化,简直是格式化,甚至是把自己重刷了一遍ROM. ...

  7. Git管理工具对比(GitBash、EGit、SourceTree)(转载)

    Git管理工具对比(GitBash.EGit.SourceTree) GitBash是采用命令行的方式对版本进行管理,功能最为灵活强大,但是由于需要手动输入希望修改的文件名,所以相对繁琐. EGit是 ...

  8. 20本最好的Linux免费书籍

    前些天Neo推荐了一个网站有<超过100本的linux免费书籍>,这里,我也向大家推荐20本最好的Linux免费书籍,当然,也是英文版的. 1. Ubuntu Pocket Guide a ...

  9. State Threads 回调终结者

    上回写了篇<一个“蝇量级”C语言协程库>,推荐了一下Protothreads,通过coroutine模拟了用户级别的multi-threading模型,虽然本身足够“轻”,杜绝了系统开销, ...

  10. Groovy 学习手册(6)

    9. 不可变特性 不可变特性和函数式编程在一起就像是花生酱和果酱在一起一样.虽然没有必要非要在一起使用,但他们相处得很好. 在纯正的函数式语言中,每个函数对本身之外没有影响,即没有副作用.这意味着每次 ...