Linux中的Socket是一种网络通信机制,允许不同计算机上的进程进行通信。Socket API提供了一组函数,用于创建、绑定、监听、连接和传输数据。多线程通信是指在一个进程中使用多个线程来处理并发任务,每个线程可以独立地执行不同的任务。
以下是一个基于Linux的TCP Socket多线程通信的简单示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#define BUF_SIZE 1024
void *client_handler(void *arg) {
int client_sock = *(int *)arg;
char buffer[BUF_SIZE];
while (1) {
int len = read(client_sock, buffer, BUF_SIZE);
if (len == 0) {
close(client_sock);
break;
}
write(client_sock, buffer, len); // Echo back the message
}
return NULL;
}
int main(int argc, char *argv[]) {
int serv_sock, clnt_sock;
struct sockaddr_in serv_adr, clnt_adr;
socklen_t clnt_adr_sz;
pthread_t t_id;
if (argc != 2) {
printf("Usage: %s <port>\n", argv[0]);
exit(1);
}
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(atoi(argv[1]));
if (bind(serv_sock, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) == -1) {
perror("bind() error");
exit(1);
}
if (listen(serv_sock, 5) == -1) {
perror("listen() error");
exit(1);
}
while (1) {
clnt_adr_sz = sizeof(clnt_adr);
clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_adr, &clnt_adr_sz);
pthread_create(&t_id, NULL, client_handler, (void *)&clnt_sock);
pthread_detach(t_id);
}
close(serv_sock);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 1024
int main(int argc, char *argv[]) {
int sock;
struct sockaddr_in serv_addr;
char buffer[BUF_SIZE];
if (argc != 3) {
printf("Usage: %s<IP> <port>\n", argv[0]);
exit(1);
}
sock = socket(PF_INET, SOCK_STREAM, 0);
if (sock == -1) {
perror("socket() error");
exit(1);
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(atoi(argv[2]));
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) {
perror("connect() error");
exit(1);
}
while (1) {
printf("Input message(Q to quit): ");
fgets(buffer, BUF_SIZE, stdin);
if (!strcmp(buffer, "q\n") || !strcmp(buffer, "Q\n"))
break;
write(sock, buffer, strlen(buffer));
int len = read(sock, buffer, BUF_SIZE - 1);
buffer[len] = 0;
printf("Message from server: %s", buffer);
}
close(sock);
return 0;
}
通过以上示例代码和解释,您可以了解基于Linux的Socket多线程通信的基础概念、优势、类型、应用场景以及常见问题的解决方法。
领取专属 10元无门槛券
手把手带您无忧上云