北飞

非一般的感觉
随笔 - 9, 文章 - 3, 评论 - 0, 引用 - 0
数据加载中……

网络编程学习系列三 OCOT

 

      第一节中讲述的简单的客户端服务器代码,那样的代码处理请求量比较少且不需要长占用的服务比较合适,当请求比较多的时候,利用上述的结构就不能满足需要,类似于ftp服务,每个服务都会占有一个套接字很长时间,而且同时可能有多个客户连接,面对这种多客户,高流量的情况,需要一种不同于简单客户端服务器那样的模式解决,这篇文章就先介绍OCOT。

      OCOT是one client one thread的简写,从字面上就可以理解,每当有一个客户连接过来,都会有一个线程为其服务,不管这个线程是预先创建的还是临时创建的。当每个客户都有专门的线程为其服务时,就可以解决上述问题。

      利用OCOT为多客户服务时,适应于连接数量有限,而且连接希望是长连接的情况,如果海量的短连接时则不适宜利用OCOT,究其原因无非是频繁的CPU执行权的切换会导致效率底下。

至于如果解决海量短连接的情况,以后再说。下面还是给一个简单的例子,其实应该给一个简单的ftp雏形的,不过为了简单,还是给一个简单点吧!
      服务端源代码:
     

 1 #include <iostream>
 2   #include <sys/socket.h>
 3   #include <sys/types.h>
 4   #include <arpa/inet.h>
 5   #include <pthread.h>
 6   using namespace std;
 7   
 8   void* thread_func(void* arg);
 9   
10  int main()
11  {
12     //create socket
13     int listen_sock = socket(AF_INET,SOCK_STREAM,0);
14     if(listen_sock < 0)
15     {
16        cout << "create socket error" << endl;
17        return -1;
18     }

19  
20     struct sockaddr_in address;
21     address.sin_family = AF_INET;
22     address.sin_port = htons(5656);
23     address.sin_addr.s_addr = htonl(INADDR_ANY);
24  
25     if(bind(listen_sock,(struct sockaddr*)&address,sizeof(address)) < 0)
26     {
27        cout << "bind socket error" << endl;
28        close(listen_sock);
29        return -1;
30     }

31  
32     listen(listen_sock,10);
33  
34     while(true)
35     {
36        void *ret;
37        int sock = accept(listen_sock,NULL,NULL);
38        pthread_t tid;
39        pthread_create(&tid,NULL,thread_func,&sock);
40       // pthread_join(tid,&ret);
41        sleep(1);
42  
43     }

44  
45     close(listen_sock);
46     return 0;
47  }

48  
49  // thread function
50  void* thread_func(void *arg)
51  {
52     int sock = *((int*)arg);
53     cout << pthread_self() <<" send data" << endl;
54     send(sock,"hello world",strlen("hello world")+1,0);
55     close(sock);
56  
57     return (void*)0;
58  }

59


posted on 2010-08-05 19:57 北飞 阅读(4571) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理