【linux高性能服务器编程】项目实战——仿QQ聊天程序源码剖析
由于原代码已经非常接近完整,以下是对原代码的部分解释和关键函数的简化示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#define SERVER_PORT 8000
#define BUFF_LEN 512
#define CLIENT_NUM_MAX 5
int sockfd_server;
struct sockaddr_in server_addr;
// 线程处理函数
void* thread_handle(void* arg) {
int *client_fd = (int*)arg;
char buff[BUFF_LEN];
while (1) {
memset(buff, 0, BUFF_LEN);
int ret = recv(*client_fd, buff, BUFF_LEN, 0);
if (ret == -1) {
perror("recv error");
continue;
} else if (ret == 0) {
printf("client close\n");
break;
}
printf("recv msg: %s\n", buff);
// 发送给所有客户端
for (int i = 0; i < CLIENT_NUM_MAX; ++i) {
if (i == *client_fd) continue;
send(i, buff, strlen(buff), 0);
}
}
close(*client_fd);
free(client_fd);
pthread_exit(NULL);
}
int main() {
// 初始化socket
sockfd_server = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd_server == -1) {
perror("socket error");
exit(1);
}
// 设置服务器地址结构
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT);
// 绑定socket
if (bind(sockfd_server, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
perror("bind error");
exit(1);
}
// 监听socket
if (listen(sockfd_server, 10) == -1) {
perror("listen error");
exit(1);
}
printf("listen success\n");
struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
pthread_t tid;
int *new_fd = malloc(sizeof(int));
while (1) {
*new_fd = accept(sockfd_server, (struct sockaddr*)&client_addr, &client_addr_len);
if (*new_fd == -1) {
perror("accept error");
continue;
}
printf("new client connect\n");
if (pthread_create(&tid, NULL, thread_handle, new_fd) != 0) {
pe
评论已关闭