模仿pgpool II的方式,建立執行緒池

2021-09-22 09:46:25 字數 3190 閱讀 8988

server端**:con-server03.c

複製**

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define hello_world_server_port    6666

#define length_of_listen_queue 20

#define buffer_size 1024

int main(int argc, char **ar**)

if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))

if ( listen(server_socket, length_of_listen_queue) )

//prepare for forking children

struct sockaddr_in client_addr;

socklen_t length = sizeof(client_addr);

int procnt;

int fds;

fd_set  readmask;

int newsock;

int fd = 0;

for (procnt=0; procnt<10; procnt++)

if (fd_isset(server_socket, &readmask))

memset( &client_addr, 0, sizeof(client_addr));

newsock = accept(fd, (struct sockaddr *)&client_addr, &length);

char buffer[buffer_size];

bzero(buffer, buffer_size);

strcpy(buffer,"hello,world! fromserver! ");

int pd;

pd=getpid();

char cpd[10];

sprintf(cpd,"%d",pd);

strcat(buffer,cpd);

strcat(buffer,"\n");

send(newsock,buffer,buffer_size,0);

bzero(buffer,buffer_size);

length = recv(newsock,buffer,buffer_size,0);

if (length < 0)

fprintf(stderr,"got: %s in %d\n",buffer,getpid());

close(newsock);

}///while circle ends

exit(0);///child ends.never goes here

}else

} /// for circle of forking ends

for(;;)

close(server_socket);

return 0; }

複製**

client端**:con-client.c

複製**

#include

#include

#include

#include

#include

#include

#include

#define hello_world_server_port    6666

#define buffer_size 1024

void talk_to_server(char ** ar**)

if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)))

struct sockaddr_in server_addr;

bzero(&server_addr,sizeof(server_addr));

server_addr.sin_family = af_inet;

if(inet_aton(ar**[1],&server_addr.sin_addr) == 0)

server_addr.sin_port = htons(hello_world_server_port);

socklen_t server_addr_length = sizeof(server_addr);

if( connect( client_socket, (struct sockaddr*)&server_addr, 

server_addr_length) < 0)

char buffer[buffer_size];

bzero(buffer,buffer_size);

int length = recv(  client_socket,  buffer,buffer_size,0);

if(length < 0)

printf("from server %s :\t%s",ar**[1],buffer);

bzero(buffer,buffer_size);

char name[64];

gethostname(name,sizeof(name));

strcpy(buffer,name);

send(client_socket,buffer,buffer_size,0);

close(client_socket); }

int main(int argc, char **ar**)

int i=0;

for(i=0; i<10000; i++)

return 0; }

複製**

基本上來說,server端的實現方式,就是:

監聽某個port, listen後,開始建立若干的子程序。在父程序裡進入sleep/迴圈;

在子程序裡面,select/accept ,accept後作動作,然後迴圈往復。

好像酒店大堂的門口,開了門納客(監聽);

然後派一批員工(子程序)等在門口(listen/accept),

若有客人來(網路請求),哪個員工(子程序)逮住了就給迎進酒店,領位(服務),然後迴圈往復。

pgpool II的效能缺陷

pgpool ii在執行在 replication mode的時候,效能低下。經過分析,發現無解 這是由pgpool ii的執行方式決定的。pgpool ii 剛開始執行的時候,就會開很多子程序,預設值128。但是,每當客戶端來乙個請求,就會有乙個子程序全權負責,別的子程序不插手。而在replica...

pgpool II的效能缺陷

pgpool ii在執行在 replication mode的時候,效能低下。經過分析,發現無解 這是由pgpool ii的執行方式決定的。pgpool ii 剛開始執行的時候,就會開很多子程序,預設值128。但是,每當客戶端來乙個請求,就會有乙個子程序全權負責,別的子程序不插手。而在replica...

pgpool II的效能缺陷

pgpool ii在執行在 replication mode的時候,效能低下。經過分析,發現無解 這是由pgpool ii的執行方式決定的。pgpool ii 剛開始執行的時候,就會開很多子程序,預設值128。但是,每當客戶端來乙個請求,就會有乙個子程序全權負責,別的子程序不插手。而在replica...