2
This commit is contained in:
104
server-exp2/togglest_pool.c
Normal file
104
server-exp2/togglest_pool.c
Normal file
@@ -0,0 +1,104 @@
|
||||
#include "common.h"
|
||||
#include "pool.h"
|
||||
|
||||
#define NTHREADS 4
|
||||
#define SBUFSIZE 16
|
||||
|
||||
void toggle(int conn_sock,int hit);
|
||||
void *serve_client(void *vargp);
|
||||
|
||||
void toggle(int conn_sock,int hit)
|
||||
{
|
||||
size_t n; int i,no=0;
|
||||
char buf[MAXLINE];
|
||||
|
||||
//printf("线程%d服务第%d个客户请求通信开始\n",tid,hit);
|
||||
while((n =recv(conn_sock, buf, MAXLINE,0))> 0) {
|
||||
printf("toggle服务器收到第%d个客户第%d个消息,长度为%d字节\n", hit,++no,(int)n);
|
||||
|
||||
for(i=0; i<n; i++)
|
||||
if(isupper(buf[i]))
|
||||
buf[i]=tolower(buf[i]);
|
||||
else if(islower(buf[i]))
|
||||
buf[i]=toupper(buf[i]);
|
||||
sleep(1);
|
||||
send (conn_sock, buf, n, 0);
|
||||
}
|
||||
//printf("线程%d服务第%d个客户请求通信结束\n",tid,hit);
|
||||
}
|
||||
|
||||
//示例任务
|
||||
void handle_request(int sock, int taskid, int tid) {
|
||||
|
||||
printf("线程%d服务第%d个客户通信开始\n",tid,taskid);
|
||||
//usleep(1);
|
||||
toggle(sock,taskid);
|
||||
printf("线程%d服务第%d个客户通信结束\n",tid,taskid);
|
||||
close(sock);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
int listen_sock, conn_sock, port,i;
|
||||
struct sockaddr_in clientaddr;
|
||||
struct hostent *hp;
|
||||
char *haddrp;
|
||||
int hit;
|
||||
|
||||
int nth[NTHREADS];
|
||||
|
||||
socklen_t clientlen=sizeof(struct sockaddr_in);
|
||||
|
||||
pthread_t tid;
|
||||
|
||||
if (argc != 2) {
|
||||
fprintf(stderr, "usage: %s <port>\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
listen_sock = open_listen_sock(port);
|
||||
if( listen_sock==-1) {
|
||||
printf("端口号%d繁忙\n",port);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
port = atoi(argv[1]);
|
||||
|
||||
listen_sock = open_listen_sock(port);
|
||||
if( listen_sock==-1) {
|
||||
printf("端口号%d繁忙\n",port);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("start main\n");
|
||||
// 初始化线程池
|
||||
threadpool* pool = initThreadPool(NTHREADS);
|
||||
|
||||
// 创建示例任务并将其添加到线程池
|
||||
for (hit=1; ; hit++) {
|
||||
conn_sock = accept(listen_sock, (SA *) &clientaddr, &clientlen);
|
||||
|
||||
/* determine the domain name and IP address of the client */
|
||||
hp = gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr,
|
||||
sizeof(clientaddr.sin_addr.s_addr), AF_INET);
|
||||
haddrp = inet_ntoa(clientaddr.sin_addr);
|
||||
//printf("server connected to %s (%s)\n", hp->h_name, haddrp);
|
||||
|
||||
task* new_task = (task*)malloc(sizeof(task));
|
||||
new_task->function = handle_request; // 假设任务函数为 toggle
|
||||
new_task->taskid = hit; // 任务参数,假设为 socket fd 或其他参数
|
||||
new_task->sock=conn_sock;
|
||||
|
||||
addTaskToThreadPool(pool, new_task); /* Insert conn_sock in task pool */
|
||||
}
|
||||
|
||||
// 等待线程池中的所有任务执行完毕
|
||||
waitThreadPool(pool);
|
||||
|
||||
// 销毁线程池
|
||||
destroyThreadPool(pool);
|
||||
|
||||
printf("stop main\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user