socketpair原理_socket负载均衡

socketpair原理_socket负载均衡描述先看下传统的CS模型,如下:总是一方发起请求,等待另一方回应。当一次传输完成之后,client端发起新的请求之后,server端才作出回应。那如何才能做到双向通信? 一种解决办法就是client端即使client,又是server,server端即使client也是server,如下:但是上述方面比较复杂,这时候就引入要分析的socketpair了。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

描述

先看下传统的CS模型,如下:
socketpair原理_socket负载均衡

总是一方发起请求,等待另一方回应。当一次传输完成之后,client端发起新的请求之后,server端才作出回应。 那如何才能做到双向通信?  一种解决办法就是client端即使client,又是server,server端即使client也是server,如下:
socketpair原理_socket负载均衡

但是上述方面比较复杂,这时候就引入要分析的socketpair了。

socketpair用于创建一对相互连接的unnamed socket。而pipe系统调用使用创建的pipe也是相互连接的unnamed pipe(无名管道)。而pipe和socketpair创建的描述符之间的区别就是:  pipe创建的描述符一端只能用于读,一端用于写,而socketpair创建的描述符任意一端既可以读也可以写。

原理

socketpair原理_socket负载均衡

使用socketpiar创建的是一对相互连接的socket,任意一段既可以做发送,也可以做接受端。所有每个socket描述符中应该有两个buf。一个为发送buf,一个为接受buf。如上图所示。

示例代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>

#define SOCKET_BUFFER_SIZE      (32768U)


void *thread_function(void *arg)
{
    int len = 0;
    int fd  = *((int*)(arg));
    char buf[500];
    int cnt = 0;

    /*主线程*/
    while(1)
    {        
        /*向main thread线程发送数据*/
        len = sprintf(buf, "Hi, main process, cnt = %d", cnt++);
        write(fd, buf, len);
    
        /*读数据*/
        len = read(fd, buf, 500);
        buf[len]='\0';
        printf("%s\n",buf);
        
        sleep(5);    
    } 
    
    return NULL;
}


int main()
{
    int ret;
    int sockets[2];
    int bufferSize = SOCKET_BUFFER_SIZE;
    pthread_t thread;
    
    ret = socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets);
    if(ret == -1)
    {
        printf("socketpair create error!\n");
        return -1;
    }
    
    
    /*设置socket描述符的选项*/
    setsockopt(sockets[0], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));
    setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));
    setsockopt(sockets[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));
    setsockopt(sockets[1], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));

    
    /*创建线程1*/
    pthread_create(&thread, NULL, thread_function, (void*)(&sockets[1]));


    int len = 0;
    int fd  = sockets[0];
    char buf[500];
    int cnt = 0;

    /*主线程*/
    while(1)
    {
        /*读数据*/
        len = read(fd, buf, 500);
        buf[len]='\0';
        printf("%s\n",buf);
        
        /*项thread线程发送数据*/
        len = sprintf(buf, "Hi, thread process, cnt = %d", cnt++);
        write(fd, buf, len);
    }

    return 0;
}

测试结果:

1.  编译代码
gcc socketpair.c -o socketpair -lpthread

2. 运行,查看结果

test$ ./socketpair 
Hi, main process, cnt = 0
Hi, thread process, cnt = 0
Hi, main process, cnt = 1
Hi, thread process, cnt = 1
Hi, main process, cnt = 2
Hi, thread process, cnt = 2
注意:  socketpair创建的只适用于父子进程或者线程间通信,不能用于两个进程之间通信。如果要实现两个进程之间的双向通信,则需要将socketpair创建的一个描述符fd发送给另一个进程,这相当于两个两个不同的进程访问同一个文件。



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181941.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • tinycorelinux安装到硬盘_tty5

    tinycorelinux安装到硬盘_tty5制作一个grub引导的5M大小的ttylinux一.ttylinux简介:i.ttylinux是一个基于2.6版内核、体积非常之小(5M左右的LiveCD)的Linux。它运行于i486以上平台的PC机上,安装之后,ttylinux的文件系统也只有8M大小,但却提供了一个完整的shell环境,并且可用来访问Internet;ii.ttylinux可以为嵌入式应…

    2022年8月12日
    7
  • 第四章:hadoop 启动wordcount实例,包括hadoop自带jar包和eclipsejar包。hdfs常用命令[通俗易懂]

    第四章:hadoop 启动wordcount实例,包括hadoop自带jar包和eclipsejar包。hdfs常用命令[通俗易懂]第四章:hadoop 启动wordcount实例,包括hadoop自带jar包和eclipsejar包。hdfs常用命令

    2022年4月23日
    46
  • java孙鑫老师视频教程笔记「建议收藏」

    java孙鑫老师视频教程笔记「建议收藏」此笔记是我开始系统学习java孙鑫老师视频教程的笔记。可供初学者学习参考哈 今天先附上第一课Java的一些基本概念第二课Java面向对象编程后面的将陆续为大家奉上 但是如果你是初学者的话,我笔记里边可能有些东西只是点了一下,没有再详尽的描述了那是因为我以前学过一段java,有一定java基础,所以如果你需要这部分更的详细讲解的话还是得麻烦你自己在网上搜一

    2022年5月17日
    37
  • 局部静态变量的定义_C语言强制转换数据类型

    局部静态变量的定义_C语言强制转换数据类型C语言中定义的静态变量存放在栈区,动态分配的内存空间位于堆区。这题答案为F为大家科普一下知识C语言中局部变量存在栈里,全局变量存静态存储区。局部变量在栈空间上分配,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定相同。局部变量也可以在堆上动态分配,但是记得使用完这个堆空间后要释放之。全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放;…

    2025年6月21日
    4
  • 简述django请求生命周期_django批量更新数据库

    简述django请求生命周期_django批量更新数据库Django请求生命周期分析1.客户端发送请求在浏览器输入url地址,例如www.baidu.com,浏览器会自动补全协议(http),变为http://www.baidu.com,现在部分网站都

    2022年8月7日
    9
  • 贝云cms内容管理系统(thinkphp5.0开源cms管理系统)

    贝云cms内容管理系统(thinkphp5.0开源cms管理系统)

    2021年11月6日
    76

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号