Linux Socket多线程通信是指在Linux操作系统下,通过Socket进行网络通信,并利用多线程技术实现并发处理的一种方式。Socket是网络通信的基本构建块,它允许不同计算机上的应用程序通过网络进行数据交换。多线程则允许多个任务在同一进程中并行执行,从而提高程序的响应速度和资源利用率。
原因:多个线程同时访问和修改共享资源可能导致数据不一致或竞态条件。
解决方法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8080
#define MAX_CLIENTS 10
int client_sockets[MAX_CLIENTS];
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* handle_client(void* arg) {
int client_socket = *(int*)arg;
char buffer[1024] = {0};
read(client_socket, buffer, 1024);
pthread_mutex_lock(&mutex);
printf("Received message: %s\n", buffer);
pthread_mutex_unlock(&mutex);
send(client_socket, "Message received", 17, 0);
close(client_socket);
return NULL;
}
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, MAX_CLIENTS) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
while (1) {
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
pthread_t thread_id;
pthread_create(&thread_id, NULL, handle_client, (void*)&new_socket);
pthread_detach(thread_id);
}
return 0;
}
原因:创建过多线程可能导致系统资源耗尽。
解决方法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8080
#define MAX_CLIENTS 10
#define MAX_THREADS 5
typedef struct {
int client_socket;
struct sockaddr_in address;
} ClientInfo;
ClientInfo clients[MAX_CLIENTS];
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int thread_count = 0;
void* handle_client(void* arg) {
ClientInfo* client_info = (ClientInfo*)arg;
int client_socket = client_info->client_socket;
char buffer[1024] = {0};
read(client_socket, buffer, 1024);
pthread_mutex_lock(&mutex);
printf("Received message: %s\n", buffer);
pthread_mutex_unlock(&mutex);
send(client_socket, "Message received", 17, 0);
close(client_socket);
free(client_info);
return NULL;
}
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, MAX_CLIENTS) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
while (1) {
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
if (thread_count >= MAX_THREADS) {
printf("Too many clients, waiting for a thread to free up...\n");
sleep(1);
continue;
}
ClientInfo* client_info = (ClientInfo*)malloc(sizeof(ClientInfo));
client_info->client_socket = new_socket;
memcpy(&client_info->address, &address, sizeof(address));
pthread_t thread_id;
pthread_create(&thread_id, NULL, handle_client, (void*)client_info);
pthread_detach(thread_id);
thread_count++;
}
return 0;
}
通过以上内容,您可以了解Linux Socket多线程通信的基础概念、优势、类型、应用场景以及常见问题的解决方法。
领取专属 10元无门槛券
手把手带您无忧上云