天河超算,计算节点和服务节点之间进行socket通信

1)ping cn5071

PING cn5071 (12.0.157.39) 56(84) bytes of data.

64 bytes from cn5071 (12.0.157.39): icmp_seq=1 ttl=64 time=0.086 ms

64 bytes from cn5071 (12.0.157.39): icmp_seq=2 ttl=64 time=0.073 ms

64 bytes from cn5071 (12.0.157.39): icmp_seq=3 ttl=64 time=0.084 ms

^C

--- cn5071 ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2014ms

rtt min/avg/max/mdev = 0.073/0.081/0.086/0.005 ms

2)客户端程序

cpp 复制代码
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h> //exit
#include <string.h> //bzero
#include <strings.h> //strncasecmp 忽略大小写比较
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
#define SERV_PORT (5001)
#define SERV_IP   "12.0.157.39" //只能用ifconfig查到的
#define BUFSIZE   (128)
#define QUIT_STR  "quit"
 
int main(void)
{
    int sock_fd;
    struct sockaddr_in cin;
    char wr_buf[BUFSIZE];
 
    //1.创建
    sock_fd = socket(AF_INET,SOCK_STREAM,0);
    if(sock_fd == -1)
    {
        perror("socket");
        exit(1);
    }
    //2.连接服务器,还是一样先配置sockaddr_in
    bzero(&cin,sizeof(cin));
    cin.sin_family = AF_INET;
    cin.sin_port   = htons(SERV_PORT);
    cin.sin_addr.s_addr = inet_addr(SERV_IP); 
    if( inet_pton(AF_INET,SERV_IP,(void*)&cin.sin_addr) != 1 )
    {
        perror("inet_pton");
        exit(1);
    }
    if( connect(sock_fd,(struct sockaddr*)&cin,sizeof(cin)) == -1 )
    {
        perror("connect");
        exit(1);
    }
 
    //3.写数据
    while(1)
    {
        bzero(wr_buf,BUFSIZE);//写之前先清零
        if( fgets(wr_buf,BUFSIZE-1,stdin) == NULL)
        {
            continue;//重新获取
        }
        write(sock_fd,wr_buf,strlen(wr_buf));//写数据--相当于发送给服务器
 
        if( strncasecmp(wr_buf,QUIT_STR,strlen(QUIT_STR)) == 0) //输入了quit
        {
            break;
        } 
    }
 
    close(sock_fd);
    return 0;
}

2)服务器程序

cpp 复制代码
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h> //exit
#include <string.h> //bzero
#include <strings.h> //strncasecmp 忽略大小写比较
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
#define SERV_PORT (5001)
#define SERV_IP   "12.0.157.39"
#define BUFSIZE   (128)
#define QUIT_STR  "quit"
 
int main(void)
{
    int sock_fd,newfd;
    struct sockaddr_in sin;
    char rd_buf[BUFSIZE];
    int read_num;
 
	//1.创建
    if( (sock_fd = socket(AF_INET,SOCK_STREAM,0)) == -1 )
    {
        perror("socket");
        exit(1);
    }
	//2.绑定 需要先配置sockaddr_in
    bzero(&sin,sizeof(sin));//清零再填充 
    sin.sin_family = AF_INET;//IPV4
    sin.sin_port   = htons(SERV_PORT);//端口号转换网络字节序
    //两种IP地址转换
    //sin.sin_addr.s_addr = inet_addr(SERV_IP);
    if( inet_pton(AF_INET,SERV_IP,(void*)&sin.sin_addr) != 1 ) 
    {
        perror("inet_pton");
        exit(1);
    }
    if(bind(sock_fd,(struct sockaddr*)&sin,sizeof(sin)) == -1)
    {
        perror("bind");
        exit(1);
    }
    //3.监听
    if( listen(sock_fd,5) == -1 )
    {
        perror("listen");
        exit(1);
    }
    //4.阻塞等待客户端连接 连接成功后需要newfd
    if( (newfd = accept(sock_fd,NULL,NULL)) == -1 )
    {
        perror("accept");
        exit(1);
    }
	while(1)
    {
        bzero(rd_buf,BUFSIZE); //读之前先请零
        do
        {
            read_num = read(newfd,rd_buf,BUFSIZE-1);
        }while(read_num < 0 && errno == EINTR);
        if(read_num < 0)
        {
            perror("read");
        }
        if(read_num == 0) //客户端关闭
        {
            printf("Client is closed!\n");
            break;
        }
        printf("Server received:%s\n",rd_buf);
        if( strncasecmp(rd_buf,QUIT_STR,strlen(rd_buf)) == 0)//客户端输入quit
        {
            printf("Client is exiting!\n");
            break;
        }
    }
    close(newfd);
    close(sock_fd);
 
    return 0;
}

4)

编译程序

g++ server.cpp -o o1.server

g++ client.cpp -o o2.client

5)运行效果

client端

./o2.client

123

456

quit

server端

yhrun -p thcp1 -w cn5071 o1.server

Server received:123

Server received:456

Server received:quit

Client is closed!

6)在天河上是支持计算节点与服务器之间的socket通信的

相关推荐
DFT计算杂谈4 小时前
服务器通过pip安装Kimi Code CLI 和使用
运维·服务器·pip
杨云龙UP8 小时前
MySQL 数据库常用备份工具对比:mysqldump、mydumper 与 XtraBackup
linux·运维·服务器·数据库·mysql·dba·备份恢复
happymagic9 小时前
java spring boot做的jar包程序,如何实现自动运行启动
java·运维·服务器·spring boot·jar
风曦Kisaki10 小时前
Kubernetes(K8s)笔记Day06: 持久化存储(emptyDir,hostPath,NFS),PV 和 PVC,StorageClass存储类
linux·运维·笔记·云原生·容器·kubernetes
Dr.kangder10 小时前
嵌入式处理器仿真技术——Hypervisor 原理与实践
服务器·嵌入式硬件·架构·嵌入式
_艾伦 耶格尔.10 小时前
基础I/O
linux
abbgogo11 小时前
TCP/IP、OSI 与常见网络协议知识点总结
网络·网络协议·计算机网络
星蓝_starblue12 小时前
零服务器、零数据库!开源growth-board,利用GitHub自动管理刷题/学习/求职全流程
服务器·数据库·程序人生·系统架构·node.js·github·改行学it
FungLeo12 小时前
Flutter 接入 Alice 调试浮窗:一个顶层 final 抢跑,把 release 网络整没了
网络·flutter
fb_1234513 小时前
Linux磁盘分区从入门到实操:MBR_GPT全解析+分区工具实战指南
java·linux·gpt