基于Linux的Socket多线程通信是指在Linux系统中使用套接字(socket)进行通信,同时利用多线程技术来处理多个客户端连接。
以下是一个使用多线程的简单TCP回显服务器示例:
#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>
#include <errno.h>
#define PORT 8080
#define BUFFER_SIZE 1024
void *client_handler(void *arg);
int main() {
int listener, conn;
struct sockaddr_in addr;
socklen_t addrlen = sizeof(struct sockaddr_in);
listener = socket(AF_INET, SOCK_STREAM, 0);
if (listener < 0) {
perror("socket");
exit(1);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind");
exit(1);
}
if (listen(listener, 10) < 0) {
perror("listen");
exit(1);
}
printf("Server is listening on port %d...\n", PORT);
while (1) {
conn = accept(listener, (struct sockaddr *)&addr, &addrlen);
if (conn < 0) {
perror("accept");
exit(1);
}
printf("Accepted connection from %s:%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
pthread_t thread_id;
if (pthread_create(&thread_id, NULL, client_handler, (void *)&conn) < 0) {
perror("pthread_create");
exit(1);
}
}
close(listener);
return 0;
}
void *client_handler(void *arg) {
int conn = *(int *)arg;
char buffer[BUFFER_SIZE];
ssize_t n;
while ((n = read(conn, buffer, BUFFER_SIZE)) > 0) {
write(conn, buffer, n);
}
if (n < 0) {
perror("read");
}
printf("Closing connection...\n");
close(conn);
return NULL;
}
在这个示例中,我们创建了一个TCP回显服务器,它在监听端口8080。
当收到客户端的连接请求时,服务器会接受这个连接并创建一个新线程来处理与客户端的通信。
线程函数client_handler
负责处理客户端发送的数据,读取数据并将其回显给客户端。
当客户端关闭连接或发生错误时,服务器将关闭相应的套接字。
© 版权声明
本站文章由不念博客原创,未经允许严禁转载!
THE END