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

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;  
}

相关推荐

  1. socket线之间进行通信

    2024-01-07 18:36:02       58 阅读
  2. 【Android】使用广播进行APP之间通信

    2024-01-07 18:36:02       32 阅读
  3. 线之间如何通信

    2024-01-07 18:36:02       53 阅读
  4. Python使用队列线中传递数据

    2024-01-07 18:36:02       21 阅读
  5. Swift中集成Socket.IO进行实时通信

    2024-01-07 18:36:02       43 阅读
  6. 面试高频知识点:2线 2.1.6线之间如何通信

    2024-01-07 18:36:02       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-07 18:36:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-07 18:36:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-07 18:36:02       82 阅读
  4. Python语言-面向对象

    2024-01-07 18:36:02       91 阅读

热门阅读

  1. 软件工程_复习

    2024-01-07 18:36:02       48 阅读
  2. LeetCode 第379场周赛个人题解

    2024-01-07 18:36:02       59 阅读
  3. vue3 里的 ts 类型工具函数

    2024-01-07 18:36:02       65 阅读
  4. SQL注入总结

    2024-01-07 18:36:02       64 阅读
  5. 认证评价的方法

    2024-01-07 18:36:02       67 阅读
  6. 数据库开发与设计过程中的问题分析总结

    2024-01-07 18:36:02       60 阅读
  7. 小程序弹窗

    2024-01-07 18:36:02       63 阅读