socket在两个线程之间进行通信

发布时间:2024年01月07日

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;  
}
文章来源:https://blog.csdn.net/qq_31756113/article/details/135369817
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。