1、shell指令碼
#!
/bin/bash
#!/bin/bash
for(
(i=1
;i<=
1100
;i=i+1)
)do./a &
echo "$i"
sleep 0.005
done
echo "***************************8"
cat test.log | grep "f"
|wc -l
cat test.log | grep "o"
|wc -l
echo "***************************"
2、客戶端**
#include
#include
#include
#include
#include
#include
/* see notes */
#include
#include
#include
#include
#include
#define msg "hello"
intmain()
//printf("create socket is successful:[%d]\n",cli_fd);if(
connect
(cli_fd,
(struct sockaddr *
)&cli_addr,
sizeof
(cli_addr)
)<0)
//printf("connect is successful\n");
/* rv = read(cli_fd, buf, sizeof(buf));
if(rv <0)
printf("data is :[%s]",buf);
*/if(
write
(cli_fd,
&msg,
sizeof
(msg)
)<0)
// printf("write is successful,\n");
memset
(buf,0,
sizeof
(buf));
rv =
read
(cli_fd, buf,
sizeof
(buf));
if(rv<0)
// printf("read is successful,data is [%s]\n",buf);
printf
("ok");
close
(cli_fd)
;exit(0);}
3、select**
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define array_size(x) (sizeof(x)/sizeof(x[0]))
//求陣列元素的個數
static
inline
void
msleep
(unsigned
long ms)
;int
socket_server_init
(char
*listen_ip,
int listen_port)
;int main (
int argc,
char
**ar**)
printf
("%s server start to listen on port %d\n"
,"59.110.42.24"
,serv_port)
;for
(i=0
; i<
array_size
(fds_arry)
; i++
)//遍歷陣列
fds_arry[0]
= listenfd;
//將第乙個陣列賦值為listenfd
for(;;
) rv =
select
(maxfd+1,
&rdset,
null
,null
,null);
//select函式的返回值是就緒描述符的數目
if(rv <0)
else
if( rv ==0)
if(fd_isset
(listenfd,
&rdset)
)//判斷指定描述符是否在集合中
found =0;
for(i=
0; i<
array_size
(fds_arry)
;i++)}
if(!found)
}else
memset
(buf,0,
sizeof
(buf));
rv =
read
(fds_arry[i]
,buf,
sizeof
(buf));
if( rv <0)
else
if(rv ==0)
elseif(
write
(fds_arry[i]
, buf , rv)
<0)
}}}}
cleanup:
close
(listenfd)
;return0;
}static
inline
void
msleep
(unsigned
long ms)
intsocket_server_init
(char
*listen_ip,
int listen_port)
setsockopt
(listenfd, sol_socket, so_reuseaddr,
&on,
sizeof
(on));
memset
(&servaddr,0,
sizeof
(servaddr));
servaddr.sin_family=af_inet;
servaddr.sin_port =
htons
(listen_port);if
(!listen_ip )
else}if
(bind
(listenfd,
(struct sockaddr *
)&servaddr,
sizeof
(servaddr)
)<0)
if(listen
(listenfd,13)
<0)
cleanup:
if(rv <0)
close
(listenfd)
;else
rv = listenfd;
return rv;
}
select 實現過程是這樣的
max就是描述符中最大的哪乙個,比如上面的圖最大的就是10,將要連線的客戶端放入fd_set中,然後用select阻塞,接著如果有乙個或者多個客戶端來了資料,select就將&rset相應的位置1,其他全部位0,比如描述符是10,和11,那麼就在&rset 10和11位置1,其他全部為0 .這樣做的目的是後面會進行乙個fd_isset判斷描述符在&rset是否存在,如果存在才能進行讀取資料。
缺點
1、只能最多建立1024個描述符。(可修改)
2、每次都要進行乙個複雜度位o(n)的迴圈
3、每次rset都需要重新復位
4、開銷大,他的描述符會從使用者態拷貝到核心態
但是select還是有缺點的,比如每次rset都需要重新復位,而且rset的位只有1024個,也就是說只能最多建立1024個描述符,不過這個可以修改,最後的缺點是每次都要進行乙個複雜度位o(n)的迴圈,就是這個迴圈c for(i=0;i,但是效能最後還是不錯的。經過測試1100個客戶端連線正常連線的達到1043個
poll多路復用壓力測試
前面幾篇文章已經實現了shell指令碼執行和客戶端的 我就不多寫了,直接上poll poll include include include include include include include include include include include include include...
epoll多路復用壓力測試
epoll相對於select poll效能優越相當之多,可以說是二者結合加強版本,我們可以設想一下,假如有100w個tcp連線,那麼每次有資料過來了,select poll都需要去從第乙個到最後乙個進行依次遍歷,而epoll會講佇列排序講發生事件放在前面,後面的就不用遍歷了,所以準確的說處理幾千的連...
多路復用 select
在之前寫過一篇五種i o模型,感興趣的可以去看一下,今天主要講其中的一種,那就是i o多路復用。因為i o多路復用可以使乙個程序同時處理多個連線。這對提高程式的效能至關重要。對於io復用的概念與理解在上文說的挺清楚了。本文主要說實現io復用的系統呼叫。在linux下,實現io復用的系統呼叫主要有三個...