socket不单单可以使用在网络通信中,也可以在多线程/进程中使用。以下是一个简单的C语言程序,演示了如何使用BSD socket在两个线程之间进行通信:
#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 <pthread.h>
#define PORT 8080
#define BUFFER_SIZE 1024
void *send_thread(void *arg) {
int sockfd = *(int *)arg;
char buffer[BUFFER_SIZE];
printf("Send thread started\n");
while (1) {
printf("Enter message: ");
fgets(buffer, BUFFER_SIZE, stdin);
send(sockfd, buffer, strlen(buffer), 0);
printf("Message sent\n");
}
pthread_exit(NULL);
}
void *recv_thread(void *arg) {
int sockfd = *(int *)arg;
char buffer[BUFFER_SIZE];
printf("Recv thread started\n");
while (1) {
int len = recv(sockfd, buffer, BUFFER_SIZE, 0);
if (len > 0) {
buffer[len] = '\0';
printf("Received message: %s\n", buffer);
} else {
break;
}
}
pthread_exit(NULL);
}
int main() {
int sockfd, newsockfd;
struct sockaddr_in serv_addr, cli_addr;
pthread_t send_thread_id, recv_thread_id;
char buffer[BUFFER_SIZE];
int opt = 1;
int addrlen = sizeof(cli_addr);
int i, valread;
// 创建socket并绑定端口号8080上,监听连接请求,最大连接数为5。
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
memset((char *) &serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET; // 使用IPv4地址族。
serv_addr.sin_addr.s_addr = INADDR_ANY; // 使用本地IP地址。
serv_addr.sin_port = htons(PORT); // 使用端口号8080。
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { // 绑定端口号。
perror("bind failed");
exit(EXIT_FAILURE);
}
listen(sockfd, 5); // 开始监听连接请求。
printf("Server started on port %d\n", PORT);
pthread_create(&send_thread_id, NULL, send_thread, &sockfd); // 创建发送线程。
pthread_create(&recv_thread_id, NULL, recv_thread, &sockfd); // 创建接收线程。
pthread_join(send_thread_id, NULL); // 等待发送线程结束。
pthread_join(recv_thread_id, NULL); // 等待接收线程结束。
close(sockfd); // 关闭socket。
return 0;
}