tcp_server.cpp:tcp服务端-与功能包rmi_driver通信

 rmi_driver功能包:https://github.com/smith-doug/rmi_driver

服务器1:监听端口30001。此端口为实时状态反馈端口,rmi_driver包中的Get类型的指令访问端口30001。

#include  <unistd.h>
#include  <sys/types.h>       /* basic system data types */
#include  <sys/socket.h>      /* basic socket definitions */
#include  <netinet/in.h>      /* sockaddr_in{} and other Internet defns */
#include  <arpa/inet.h>       /* inet(3) functions */
 
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
 
#define MAXLINE 1024
//typedef struct sockaddr  SA;
void handle(int connfd);
 
int  main(int argc, char **argv)
{
    int     listenfd, connfd;
    int  serverPort = 30001;
    int listenq = 1024;
    pid_t   childpid;
    char buf[MAXLINE];
    socklen_t socklen;
 
    struct sockaddr_in cliaddr, servaddr;
    socklen = sizeof(cliaddr);
 
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(serverPort);
 
    //create socket  创建套接字
    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    if (listenfd < 0)
    {
        perror("socket error");
        return -1;
    }
    
    //bind 绑定套接字
    if (bind(listenfd, (struct sockaddr *) &servaddr, socklen) < 0) 
    {
        perror("bind error");
        return -1;
    }
    
    //listen 监听套接字  Listen()并未开始接收连线,只是设置socket为listen模式,真正接收client端连线的是accept()
    if (listen(listenfd, listenq) < 0) {
        perror("listen error");    
        return -1;
    }
    printf("echo server startup,listen on port:%d\n", serverPort);
    
    for ( ; ; ) 
    {
      // accept()用来接受参数sock的socket连线,当有连线进来时accept()会返回一个新的socket,这里为connfd。
      //往后的数据传送与读取就是经由新的socket处理,而原来参数s的socket能继续使用accept()来接受新的连线要求。  
      connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &socklen);
        if (connfd < 0)
        {
            perror("accept error");
            continue;
        }
        sprintf(buf, "accept form %s:%d\n", inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port);
        printf(buf,"");
	
	//创建子线程
        childpid = fork();
        if (childpid == 0) 
        { /* child process */
            close(listenfd);    /* close listening socket */
            handle(connfd);   /* process the request */
            exit (0);
        }
        else if (childpid > 0) 
        {
            close(connfd);          /* parent closes connected socket */
        } 
        else
        {
            perror("fork error");
        }
    }
}
 
 
void handle(int connfd)
{
    size_t n;
    char    buf[MAXLINE];
 
    for(;;)
    {
        n = read(connfd, buf, MAXLINE);
        if (n < 0)
        {
	  printf("Reading stream error!\n");
	  break;
        }
        if (n == 0)
        {
            //connfd is closed by client
            close(connfd);
            printf("client exit\n");
            break;
        }
        //client exit
        printf("received data: %s", buf);
        if (strncmp("exit", buf, 4) == 0) 
        {
            close(connfd);
            printf("client exit\n");
            break;
        }
        if (strncmp("get version", buf, 11) == 0) {
	  const char* msg = "0.0.9\n";
          if( send(connfd, const_cast<char*>(msg), strlen(msg), 0) == -1)
                printf("send error!\n");
	}
        if (strncmp("get status", buf, 10) == 0) {
	  const char* msg = "1 2 3 4 5 6 7 ; 1 2 1 1 1 1\n";
          if( send(connfd, const_cast<char*>(msg), strlen(msg), 0) == -1)
                printf("send error!\n");
	}
        if (strncmp("get joint_position", buf, 18) == 0) {
	  const char* msg = "1 2 3 4 5 6 7\n";
          if( send(connfd, const_cast<char*>(msg), strlen(msg), 0) == -1)
                printf("send error!\n");
	}
        if (strncmp("get tool_frame", buf, 14) == 0) {
	  const char* msg = "1 2 1 1 1 1\n";
          if( send(connfd, const_cast<char*>(msg), strlen(msg), 0) == -1)
                printf("send error!\n");
	}
        //write(connfd, buf, n); //write maybe fail,here don't process failed error
    } 
} 

服务器2:监听端口30000。此端口为运动指令接收端口,rmi_driver包中的Cmd类型的指令访问端口30000。

#include  <unistd.h>
#include  <sys/types.h>       /* basic system data types */
#include  <sys/socket.h>      /* basic socket definitions */
#include  <netinet/in.h>      /* sockaddr_in{} and other Internet defns */
#include  <arpa/inet.h>       /* inet(3) functions */
 
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
 
#define MAXLINE 1024
//typedef struct sockaddr  SA;
void handle(int connfd);
 
int  main(int argc, char **argv)
{
    int     listenfd, connfd;
    int  serverPort = 30000;
    int listenq = 1024;
    pid_t   childpid;
    char buf[MAXLINE];
    socklen_t socklen;
 
    struct sockaddr_in cliaddr, servaddr;
    socklen = sizeof(cliaddr);
 
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(serverPort);
 
    //create socket  创建套接字
    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    if (listenfd < 0)
    {
        perror("socket error");
        return -1;
    }
    
    //bind 绑定套接字
    if (bind(listenfd, (struct sockaddr *) &servaddr, socklen) < 0) 
    {
        perror("bind error");
        return -1;
    }
    
    //listen 监听套接字  Listen()并未开始接收连线,只是设置socket为listen模式,真正接收client端连线的是accept()
    if (listen(listenfd, listenq) < 0) {
        perror("listen error");    
        return -1;
    }
    printf("echo server startup,listen on port:%d\n", serverPort);
    
    for ( ; ; ) 
    {
      // accept()用来接受参数sock的socket连线,当有连线进来时accept()会返回一个新的socket,这里为connfd。
      //往后的数据传送与读取就是经由新的socket处理,而原来参数s的socket能继续使用accept()来接受新的连线要求。  
      connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &socklen);
        if (connfd < 0)
        {
            perror("accept error");
            continue;
        }
        sprintf(buf, "accept form %s:%d\n", inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port);
        printf(buf,"");
	
	//创建子线程
        childpid = fork();
        if (childpid == 0) 
        { /* child process */
            close(listenfd);    /* close listening socket */
            handle(connfd);   /* process the request */
            exit (0);
        }
        else if (childpid > 0) 
        {
            close(connfd);          /* parent closes connected socket */
        } 
        else
        {
            perror("fork error");
        }
    }
}
 
 
void handle(int connfd)
{
    size_t n;
    char    buf[MAXLINE];
 
    for(;;)
    {
        n = read(connfd, buf, MAXLINE);
        if (n < 0)
        {
	  printf("Reading stream error!\n");
	  break;
        }
        if (n == 0)
        {
            //connfd is closed by client
            close(connfd);
            printf("client exit\n");
            break;
        }
        //client exit
        printf("received data: %s", buf);
        if (strncmp("exit", buf, 4) == 0) 
        {
            close(connfd);
            printf("client exit\n");
            break;
        }
        
        if (strncmp("ptp joints", buf, 10) == 0) {
	  const char* msg = "Done\n";
	  sleep(0.5);
          if( send(connfd, const_cast<char*>(msg), strlen(msg), 0) == -1)
                printf("send error!\n");
	}
        //write(connfd, buf, n); //write maybe fail,here don't process failed error
    } 
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值