Chinaunix首页 | 论坛 | 博客
  • 博客访问: 322385
  • 博文数量: 64
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 1972
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 21:53
个人简介

文明之精神,野蛮之体魄。

文章分类
文章存档

2015年(4)

2013年(60)

我的朋友

分类: LINUX

2013-08-29 11:09:50

//TCPmethod.c
  1#include
  2 #include
  3 #include
  4 #include
  5 #include
  6
  7 #include
  8 #include
  9 #include
 10 #include
 11 #include
 12 #include
 13 #include
 14 #include
 15 #include
 16
 17 #define QLEN 32
 18 #define BUFSIZE 4096
 19 #define INTERVAL 5
 20
//stats共享结构体用来保存连接的相关统计信息。
 21 struct{
 22     pthread_mutex_t st_mutex;
 23     unsigned int st_concount;
 24     unsigned int st_contotal;
 25     unsigned long st_contime;
 26     unsigned long st_bytecount;
 27 }stats;
 28
 29 void prstats(void);//以定期打印连接的相关统计信息,然后睡眠INTERVAL秒。
 30 int TCPechod(int fd);
 31 int errexit(const char *fromat,...);
 32 int passiveTCP(const char *service,int qlen);
 33
 34 int main(int argc,char **argv)
 35 {
 36     pthread_t th;
 37     pthread_attr_t ta;
 38     char *service = "echo";
 39     struct sockaddr_in fsin;
 40     unsigned int alen;
 41     int msock,ssock;
 42     switch(argc){
 43         case 1:
 44             break;
 45         case 2:
 46             service = argv[1];
 47             break;
 48         default:
 49             errexit("usage:TCPechod[port]\n");
 50
 51     }
 52
 53     msock = passiveTCP(service,QLEN);
 54     pthread_attr_init(&ta);
 55     pthread_attr_setdetachstate(&ta,PTHREAD_CREATE_DETACHED);
 56     pthread_mutex_init(&stats.st_mutex,0);
 57
 58     if(pthread_create(&th,&ta,(void * (*)(void*))prstats,0) < 0)
 59         errexit("pthread_create(prstats):%s\n",strerror(errno));
 60
 61     while(1){
 62         alen = sizeof(fsin);
 63         ssock = accept(msock,(struct sockaddr*)&fsin,&alen);
 64         if(ssock < 0){
 65             if(errno = EINTR)
 66                 continue;
 67             errexit("accept:%s\n",strerror(errno));
 68         }
 69         if(pthread_create(&th,&ta,(void * (*)(void *))TCPechod,(void *)ssock) < 0)
 70             errexit("pthread_create:%s\n",strerror(errno));
 71     }
 72 }
 73 int TCPechod(int fd)
 74 {
 75     time_t start;
 76     char buf[BUFSIZE];
 77     int cc;
 78     start = time(0);
 79     pthread_mutex_lock(&stats.st_mutex);
 80     stats.st_concount++;
 81     pthread_mutex_unlock(&stats.st_mutex);
 82     while(cc = read(fd,buf,sizeof(buf))){
 83         if(cc < 0)
 84             errexit("echo read:%s\n",strerror(errno));
 85         if(write(fd,buf,cc) < 0)
 86             errexit("echo write:%s\n",strerror(errno));
 87         pthread_mutex_lock(&stats.st_mutex);
 88         stats.st_bytecount += cc;
 89         pthread_mutex_unlock(&stats.st_mutex);
 90     }
 91     close(fd);
 92     pthread_mutex_lock(&stats.st_mutex);
 93     stats.st_contime += time(0) - start;
 94     stats.st_concount--;
 95     stats.st_contotal++;
 96     pthread_mutex_unlock(&stats.st_mutex);
 97     return 0;
 98 }
 99 void prstats(void)
100 {
101     time_t now;
102     while(1){
103         sleep(INTERVAL);
104         pthread_mutex_lock(&stats.st_mutex);
105         now = time(0);
106         printf("--- %s",ctime(&now));
107         printf("%-32s: %u\n","Current connections",stats.st_concount);
108         printf("%-32s: %u\n","Completed connections",stats.st_contotal);
109         if(stats.st_contotal){
110             printf("%-32s: %.2f(secs)\n","Average complete connection time",(float)stats.st_contime/(float)stats.st_contotal);
111             printf("%-32s: %.2f\n","Average byte count",(float)stats.st_bytecount/(float)(stats.st_contotal + stats.st_concount));
112         }
113         printf("%-32s: %lu\n\n","Total byte count",stats.st_bytecount);
114         pthread_mutex_unlock(&stats.st_mutex);
115     }
116 }

  1 int passivesock(const char *service,const char *transport,int qlen);
  2 int passiveTCP(const char *service,int qlen)
  3 {
  4     passivesock(service,"tcp",qlen);
  5 }

  1 #include
  2 #include
  3 #include
  4 #include
  5 #include
  6 #include
  7 #include
  8
  9 int errexit(const char *format,...);
 10 unsigned short portbase = 1000;
 11
 12 int passivesock(const char *service,const char *transport,int qlen)
 13 {
 14     struct servent *pse;
 15     struct protoent *ppe;
 16     struct sockaddr_in sin;
 17     int s,type;
 18     memset(&sin,0,sizeof(sin));
 19     sin.sin_family = AF_INET;
 20     sin.sin_addr.s_addr = INADDR_ANY;
 21
 22     if(pse = getservbyname(service,transport))
 23         sin.sin_port = htons(ntohs((unsigned short)pse->s_port) + portbase);
 24     else if((sin.sin_port = htons((unsigned short)atoi(service))) == 0)
 25         errexit("can't get \"%s\"service entry\n",service);
 26
 27     if((ppe = getprotobyname(transport)) == 0)
 28         errexit("can't get \"%s\"protocol entry\n",transport);
 29     if(strcmp(transport,"udp") == 0)
 30         type = SOCK_DGRAM;
 31     else
 32         type = SOCK_STREAM;
 33     s = socket(PF_INET,type,ppe->p_proto);
 34     if(s < 0)
 35         errexit("can't create socket: %s\n",strerror(errno));
 36     if(bind(s,(struct sockaddr*)&sin,sizeof(sin)) < 0)
 37         errexit("can't bind to %s port:%s\n",service,strerror(errno));
 38     if(type == SOCK_STREAM && listen(s,qlen) < 0)
 39         errexit("can't listen on %s port:%s\n",service,strerror(errno));
 40     return s;
 41 }



阅读(3458) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~