进程间通信—Socket

业务上,C++编写的进程A和GO编写的进程B,需要在同一设备内通信。为此测试不同通信方式的性能。

在这个实验里,测试用socket实现进程间通信的性能,读写都使用单线程。

1. C++程序写数据 (cSock.cpp)

#include <iostream>
#include <string>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define SEND_TIMES 1000000

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};
    std::string hello = "01234567890123456789012345678901";

    // 创建socket
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        return 1;
    }

    // 配置SO_REUSEADDR选项
    int opt = 1;
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
        perror("setsockopt failed");
        return 1;
    }

    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);

    // 绑定套接字到地址和端口
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        return 1;
    }

    // 监听连接
    if (listen(server_fd, 3) < 0) {
        perror("listen failed");
        return 1;
    }

    // 接受连接
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("accept failed");
        return 1;
    }

    // 发送数据
    for(int i = 0; i < SEND_TIMES; i++) {
        send(new_socket, hello.c_str(), hello.length(), 0);
    }

    // 等待2秒后关闭连接
    sleep(2);
    close(new_socket);

    return 0;
}

2. GO程序读数据 (gSock.go)

package main

import (
	"fmt"
	"net"
	"time"
)

func main() {
	conn, err := net.Dial("tcp", "localhost:8080")
	if err != nil {
		fmt.Println("Error connecting:", err)
		return
	}
	defer conn.Close()

	t1 := time.Now().UnixNano()

	buffer := make([]byte, 1024)
	for {
		n, err := conn.Read(buffer)
		if err != nil {
			if err.Error() == "EOF" {
				break // 读取到EOF时退出循环
			}

			fmt.Println("Error reading:", err)
			return
		}
		if n == 0 {
			fmt.Println("Connection closed by client")
			break
		}
		
		_ = string(buffer[:n])
	}

	t2 := (time.Now().UnixNano() - t1) / 1000000
	fmt.Printf("单线程所用时长:%d ms\n",  t2)
}

3. 实验结果

实验环境:Intel(R) Xeon(R) Gold 6161 CPU @ 2.20GHz

实验数据如下表,最终结果取十次测试的平均值。

可以看出,用socket通信的时间 (3504.8ms)比用命名管道 (2805.5ms) 要高一些。

命名管道实验参考:进程间通信—命名管道-CSDN博客

读(go)-写(c++) 线程数建立的socket连接数读写数据量每次实验时长(ms)平均时长 (ms)
1-1132MB3653
3374
3410
3418
3589
3342
3806
3360
3502
3694
3504.8
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值