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

本文介绍了一个C语言程序,展示了如何使用BSDsocket在两个独立线程中进行双向通信,包括创建socket、绑定端口、监听连接以及线程间的数据传输。
摘要由CSDN通过智能技术生成

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;  
}
  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值