1、c_client_c *temp_c1 = NULL, *temp_c2 = NULL;/等待的/初始化client信息void init_client() int i = 0; for (i = 0; i MAX_CLIENT; i+) clienti.sockfd = -1; memset(clienti.name, 0, 20); clienti.pid = -1; clienti.flg = -1; /查找结构体数组中sockfd为-1的下标值int find_fd(c_client *client) while (i sockfd & i sockfd, buf, strlen(bu
2、f), 0);/ALLvoid sendto_all(c_client *p_client, char *buf) char sendbuf1024 = 0 ; sprintf(sendbuf, AFROMrn%srn%s, p_client-name, buf + 5); clienti.flg != -1) if(send(clienti.sockfd, sendbuf, strlen(sendbuf), 0) sockfd, sendbuf, strlen(sendbuf), 0); else FROMrn%srn%sname, buf + 4 + strlen( name) + 2);
3、 if(send(sock, sendbuf, strlen(sendbuf), 0)name); close(p_client-sockfd); p_client-sockfd = -1;pid = -1;flg = -1; sprintf(buf,NOTICE1rn%s退出聊天室rnrn memset(p_client-name,0,20); for(i=0;inext != NULL) memset(buf,0,1024); pthread_rwlock_rdlock(&idx_lock); idx = find_fd(client); pthread_rwlock_unlock(& c
4、lientidx.sockfd = head-next-sockfd; pthread_rwlock_wrlock(&wait_lock); temp = head-next; head-next = head- free(temp); sprintf(buf,NOTICErn您已被唤醒,请继续操作rnrn send(clientidx.sockfd,buf,strlen(buf),0); if (pthread_create(&clientidx.pid, NULL, (void *)pthread_fun,(void *) &clientidx) != 0) perror(pthread_
5、create pthread_detach(clientidx.pid);void pthread_fun(void* cclient) c_client *p_client = (c_client *) cclient; char bufMAX_SIZE = 0 ; int i, n; char *p;%s, NOTICErn通讯通道开启rnrn if (send(p_client-sockfd, sendbuf, strlen(sendbuf), 0) sockfd, buf, sizeof(buf) - 1, MSG_NOSIGNAL); if (n p_client- break; i
6、f (logform(buf) if (cmpname(buf, p_client) = 0) send(p_client-sockfd, ERRORrn用户名重复rnrn, 26, 0); continue; else p_client-flg = 1; p = strtok(buf + 7, strcpy(p_client-name, p); sprintf(sendbuf, 100rn%srnrnsockfd, sendbuf, sizeof(sendbuf), 0);%s进入聊天室n for (i = 0; if (clienti.sockfd ! clienti.sockfd ! s
7、end(clienti.sockfd, sendbuf, sizeof(sendbuf), 0); memset(sendbuf, 0, 1024); while (1) memset(buf, 0, MAX_SIZE); if (n = recv(p_client-sockfd, buf, MAX_SIZE, 0) ERRORrn信息不符合协议要求rnrn, 38, 0); else send(p_client-ERRORrn未登录,请您登录再进行其他操作rnrn, 56, 0); pthread_exit(NULL);int main() int ser_sockfd, clt_sockf
8、d; struct sockaddr_in addr; / pthread_rwlock_t idx_lock,wait_lock; pthread_rwlock_init(&idx_lock, NULL);wait_lock, NULL); init_client(); /创建服务器sockfd if (ser_sockfd = socket(AF_INET, SOCK_STREAM, 0) = -1) perror(socket exit(1); /设置服务器网络地址 bzero(&addr, sizeof(addr); addr.sin_family = AF_INET; addr.si
9、n_port = htons(PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY); /设置端口可重用 int opt = 1; setsockopt(ser_sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt); /将套接字绑定到服务器的网络地址上 if (bind(ser_sockfd, (struct sockaddr*)&addr, sizeof(addr) = -1) bindbind successn /监听连接请求-监听队列长度为10 if (listen(ser_sockfd, 10)
10、= -1) listenlisten successn if (clt_sockfd = accept(ser_sockfd, NULL, NULL) = -1) acceptidx=%dn,idx); if (idx != -1) /连接末满 clientidx.sockfd = clt_sockfd; if (pthread_create(&clientidx.pid, NULL,(void *) pthread_fun, (void *)& perror( pthread_detach(clientidx.pid); else /连接已满,等待 temp_c1 = (c_client_c
11、 *) malloc(sizeof(c_client_c); temp_c1-sockfd = clt_sockfd;next = NULL; pthread_rwlock_wrlock(& if (head = NULL) head = (c_client_c *) malloc(sizeof(c_client_c); head-next = temp_c1; for (temp_c2 = head; temp_c2-= NULL; temp_c2= temp_c2-next); temp_c2- pthread_rwlock_unlock(& memset(buf, 0, 1024); s
12、printf(buf, NOTICErn服务器已满,请等候rnrn/客户端接受 则等待 if (send(temp_c1-sockfd, buf, strlen(buf), 0) termios.hstatic int FLAGE = -1;char name20 = 0;void fun_show(int sockfd) char sendbuf256 = 0; sprintf(sendbuf, if(send(sockfd,sendbuf,strlen(sendbuf),0) close(sockfd);void fun_all(int sockfd) char sendbufMAX_SI
13、ZE = 0;,5);输入发送的内容:n scanf(,sendbuf+5); sprintf(sendbuf+strlen(sendbuf), if(send(sockfd,sendbuf,strlen(sendbuf),0) void fun_one(int sockfd) char name320 = 0;输入聊天对象:,name3);TOrn%srn输入聊天内容:,sendbuf+strlen(sendbuf);void fun_quit(int sockfd) char sendbuf256 = ; close(sockfd);void *pthread_fun(int *sock) int sockfd
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1