Files
C-exp-collection/server-exp2/togglest_pre.c
2026-05-28 08:48:01 +08:00

101 lines
2.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "common.h"
#include "taskline.h"
#define NTHREADS 4
#define SBUFSIZE 16
void toggle(int conn_sock,int hit);
void *handle_request(void *vargp);
task_line_t tlp; /* task pool: shared buffer of connected descriptors */
int main(int argc, char **argv)
{
int listen_sock, conn_sock, port,i;
struct sockaddr_in clientaddr;
struct hostent *hp;
char *haddrp;
int hit;
task_t item; //连接客户信息socket和客户编号
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]);
task_line_init(&tlp, SBUFSIZE);
listen_sock = open_listen_sock(port);
if( listen_sock==-1) {
printf("端口号%d繁忙\n",port);
exit(1);
}
for (i = 0; i < NTHREADS; i++) { /* Create worker threads */
nth[i]=i;
pthread_create(&tid, NULL, handle_request, (void *)&nth[i]);
}
for (hit=1; ; hit++) {
item.conn_sock = accept(listen_sock, (SA *) &clientaddr, &clientlen);
item.hit=hit;
/* 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_insert(&tlp, item); /* Insert conn_sock in task pool */
}
}
void *handle_request(void *vargp)
{
int tid=*(int*) vargp;
task_t item;
pthread_detach(pthread_self());
while (1) {
item=task_remove(&tlp); /* Remove a task from task line */
printf("线程%d服务第%d个客户通信开始\n",tid,item.hit);
toggle(item.conn_sock,item.hit); /* Serve client */
close(item.conn_sock);
printf("线程%d服务第%d个客户通信结束\n",tid,item.hit);
}
}
void toggle(int conn_sock,int hit)
{
size_t n; int i,no=0;
char buf[MAXLINE];
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]);
send (conn_sock, buf, n, 0);
}
}