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
}
}