您是一位c++老师,我是一位新手学员,刚刚我在上学习c++,但是网课老师没有很好的解释和告知代码编译每个环节的作用,每个成员的作用,这里请你根据代码分析,并以一下方式解答:
1.首先告知代码是怎么跑的,最好是整个流程图解(小白友好版)
2.主要是讲什么内容
3.其次对里面的每个成员和环节和作用进行解释教学,方便新手学员看懂。
代码如下:
int clnt_socks[100] = { 0 };
int clnt_cnt = 0;
pthread_mutex_t mutex1;
void send_msg(const char* msg, ssize_t str_len)
{
pthread_mutex_lock(&mutex1);
for (int i = 0; i < clnt_cnt; i++) {
if (clnt_socks[i] >= 0)
write(clnt_socks[i], msg, str_len);
}
pthread_mutex_unlock(&mutex1);
}
void* handle_clnt(void* arg)
{
pthread_detach(pthread_self());
int clnt_sock = *(int*)arg;
char msg[1024] = "";
ssize_t str_len = 0;
while ((str_len = read(clnt_sock, msg, sizeof(msg))) > 0) {
//TODO:过滤敏感词
send_msg(msg, str_len);
}
pthread_mutex_lock(&mutex1);
//for (int i = 0; i < clnt_cnt; i++) {//TDDO:优化逻辑
// if (clnt_sock == clnt_socks[i]) {
// clnt_socks[i] = -1;
// break;
// }
//}
*(int*)arg = -1;
pthread_mutex_unlock(&mutex1);
close(clnt_sock);
pthread_exit(NULL);
}
void server98() {
int serv_sock, clnt_sock;
struct sockaddr_in serv_adr, clnt_adr;
socklen_t clnt_adr_sz = sizeof(clnt_adr);
serv_sock = socket(PF_INET, SOCK_STREAM, 0);
memset(&serv_adr, 0, sizeof(serv_adr));
serv_adr.sin_family = AF_INET;
serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_adr.sin_port = htons(9527);
pthread_mutex_init(&mutex1, NULL);
if (bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr)) == -1) {
printf("bind error %d %s", errno, strerror(errno));
return;
}
if (listen(serv_sock, 5) == -1) {
printf("listen error %d %s", errno, strerror(errno));
return;
}
for (;;) {//while(1)等价
clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);
if (clnt_sock == -1) {
printf("accept error %d %s", errno, strerror(errno));
break;
}
pthread_mutex_lock(&mutex1);
clnt_socks[clnt_cnt++] = clnt_sock;
pthread_mutex_unlock(&mutex1);
pthread_t thread;
pthread_create(&thread, NULL, handle_clnt, &clnt_socks[clnt_cnt - 1]);
}
close(serv_sock);
pthread_mutex_destroy(&mutex1);
}
sem_t semid;
char name[64] = "[DEFAULT]";
void* client_send_msg(void* arg) {
pthread_detach(pthread_self());
int sock = *(int*)arg;
char msg[256] = "";
char buffer[1024];
while (true) {
memset(buffer, 0, sizeof(buffer));
fgets(msg, sizeof(msg), stdin);
if ((strcmp(msg, "q\n") == 0) || (strcmp(msg, "Q\n") == 0)) {
break;
}
snprintf(buffer, sizeof(msg), "%s %s", name, msg);
write(sock, buffer, strlen(buffer));
}
sem_post(&semid);
pthread_exit(NULL);
}
void* client_recv_msg(void* arg) {
pthread_detach(pthread_self());
int sock = *(int*)arg;
char msg[256] = "";
while (true) {
ssize_t str_len = read(sock, msg, sizeof(msg));
if (str_len <= 0)break;
fputs(msg, stdout);
memset(msg, 0, str_len);
}
sem_post(&semid);
pthread_exit(NULL);
}
void client98() {
int sock = socket(PF_INET, SOCK_STREAM, 0);
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(9527);
fputs("input your name:", stdout);
scanf("%s", name);
if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
printf("connect error %d %s", errno, strerror(errno));
return;
}
pthread_t thsend, threcv;
sem_init(&semid, 0, -1);
pthread_create(&thsend, NULL, client_send_msg, (void*)&sock);
pthread_create(&threcv, NULL, client_recv_msg, (void*)&sock);
sem_wait(&semid);
close(sock);
}
void lession98(const char* arg)
{
if (strcmp(arg, "s") == 0) {
server98();
}
else {
client98();
}
}