Environment:Linux
/*
* thread pool
* parameters:
thread function
thread function parameter
threadpool depth
* */
void createThreadPool(void*(*thFtn)(void*),void* arg,int depth){
//initalize all identidy of thread
long *tids = calloc(sizeof(long),depth);
//loop to create all threads
int _i = 0;
for(;_i<depth;_i++){
pthread_create(&tids[_i],0,thFtn,arg);
}
}
Tcp Preallocate Thread:
1> tpt.h
//tcp_preallocate_thread
//tpt.h
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
2> server.c
#include "tpt.h"
#define BACKLOG 2
#define PORT 8888
#define BUFFERSIZE 1024
void createThreadPool(void*(*)(void*),void* arg,int);
void *thFtn(void *);
int tptServer(char *);
void server_process(int);
//lock ss in every thread
pthread_mutex_t mlock=PTHREAD_MUTEX_INITIALIZER;
//globalize server socket
int ss;
int main(int argc,char **argv){
if(argc==2){
tptServer(argv[1]);
}else{
return 0;
}
}
/*
* thread pool
* parameters:
thread function
thread function parameter
threadpool depth
* */
void createThreadPool(void*(*thFtn)(void*),void* arg,int depth){
//initalize all identidy of thread
long *tids = calloc(sizeof(long),depth);
//loop to create all threads
int _i = 0;
for(;_i<depth;_i++){
pthread_create(&tids[_i],0,thFtn,arg);
}
}
/*
* thread function
*
*/
void *thFtn(void *arg){
struct sockaddr_in client_addr;
//connectFd
int sc;
for(;;){
int addr_len = sizeof(struct sockaddr);
pthread_mutex_lock(&mlock);
sc = accept(ss,(struct sockaddr*)&client_addr,&addr_len);
pthread_mutex_unlock(&mlock);
if(sc == -1){
perror("accept");
exit(EXIT_FAILURE);
}
server_process(sc);
close(sc);
}
}
/*
Server process
*/
void server_process(int sc){
char buffer[BUFFERSIZE];
for(;;){
int size = read(sc,buffer,BUFFERSIZE);
if(size == 0){
continue;
}
/*char *strsep(char **stringp, const char *delim);*/
char *sp,*token,*endp;
sp = buffer;
long result=0;
while((token=strsep(&sp," "))!=NULL){
result += strtol(token,&endp,10);
}
printf("%i\n",result);
memset(buffer,0,BUFFERSIZE);
}
}
int tptServer(char *IP){
int _i;
int _err;
struct sockaddr_in server_addr;
pid_t pid;
ss = socket(AF_INET,SOCK_STREAM,0);
if(ss == -1){
perror("socket");
exit(EXIT_FAILURE);
}
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr(IP);
_err = bind(ss,(struct sockaddr*)&server_addr,sizeof(server_addr));
if(_err == -1){
perror("bind");
exit(EXIT_FAILURE);
}
_err = listen(ss,BACKLOG);
if(_err == -1){
perror("listen");
exit(EXIT_FAILURE);
}
//create thread pool
//depth 20
createThreadPool(thFtn,NULL,20);
pause();
return 0;
}
3> client.c
#include "tpt.h"
#define PORT 8888
#define BUFFERSIZE 1024
void client_process(int);
int main(int argc,char **argv){
int ss;
struct sockaddr_in server_addr;
ss = socket(AF_INET,SOCK_STREAM,0);
if(ss == -1){
perror("socket");
exit(EXIT_FAILURE);
}
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
inet_pton(AF_INET,argv[1],&server_addr.sin_addr);
connect(ss,(struct sockaddr*)&server_addr,sizeof(server_addr));
client_process(ss);
close(ss);
return 0;
}
void client_process(int ss){
int size = 0;
char buffer[BUFFERSIZE];
for(;;){
size = read(0,buffer,BUFFERSIZE);
if(!strcmp(buffer,"quit\n")){
printf("Bye~\n");
return;
}
if(size>0){
write(ss,buffer,size);
}
memset(buffer,0,BUFFERSIZE);
}
}