我在ROS环境中写了一个客户端,无法连接Windows平台上服务端,请教下ROS与非ROS系统是否需要某种特定的网络连接方式,代码如下:
#include <ros/ros.h>
//#include <wifi_get/wifi_nice.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>
#include <geometry_msgs/Twist.h>  
#include <geometry_msgs/TwistStamped.h>  
#include <nav_msgs/Odometry.h>  
#include "tf/LinearMath/Matrix3x3.h"  
#include "geometry_msgs/Quaternion.h" 
#define BACKLOG 10
#define MAXSIZE 1024
#define SERVPORT 8000
#define MAXDATASIZE 100
#define SERVER_IP_1 "123.206.94.11"
#define SERVER_IP_2 "127.0.0.1"
#define SERVER_IP_3 "192.168.1.104"
#define vel_angle_max 5
#define BUFSIZ1 1000
using namespace std;
 
int main(int argc, char **argv)
{
    int client_sockfd;  
    int rec_len,send_len;
    int Angle,Angle_flag;  
    double vel_angle_,vel_speed;
    struct sockaddr_in remote_addr; //服务器端网络地址结构体  
    char buf[BUFSIZ1];  //数据传送的缓冲区
    char buf_send[BUFSIZ1];  //数据传送的缓冲区
    char str[BUFSIZ1];    char buf_rec[BUFSIZ1];  //数据传送的缓冲区
    string str_angule,str_speed;
    string rebackmsg;
    string recivemsg; 
    printf("test/n");        
    //memset(&remote_addr,0,sizeof(remote_addr)); //数据初始化--清零 
    bzero(&remote_addr, sizeof(remote_addr)); 
    remote_addr.sin_family=AF_INET; //设置为IP通信  
    remote_addr.sin_addr.s_addr=inet_addr(SERVER_IP_2);//服务器IP地址  
    remote_addr.sin_port=htons(SERVPORT); //服务器端口号 
    //remote_addr.sin_addr.s_addr=inet_addr("123.206.94.11");//服务器IP地址  
    //remote_addr.sin_port=htons(8443); //服务器端口号      printf("test1/n");      
    /*创建客户端套接字--IPv4协议,面向连接通信,TCP协议*/  
    if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)  
    //if((client_sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
    {  
        perror("socket");  
        return 1;  
    }  
     printf("creat socket ok!/n");  
    /*将套接字绑定到服务器的网络地址上*/  
    if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)  
    {  
        printf("cannot connect sever!/n"); 
        perror("connect");  
        return 1;  
    }  
    //write(sockfd_1, DATA, sizeof(DATA));
    printf("connected to server/n");  
    rec_len=recv(client_sockfd,buf,BUFSIZ1,0);//接收服务器端信息  
         buf[rec_len]='\0';  
    printf("%s",buf); //打印服务器端信息 
 
 
  //用于解析ROS参数,第三个参数为本节点名
  ros::init(argc, argv, "APP_Client");
  ros::NodeHandle handle_;
  ros::Publisher  vel_pub_ ; 
  geometry_msgs::Twist  controlVel_;
  vel_pub_ = handle_.advertise<geometry_msgs::Twist>("/cmd_vel",1); 
  ros::Rate loop_rate(2);  controlVel_.angular.z = 0;  
  controlVel_.linear.x  = 0;  
  controlVel_.linear.y  = 0;  
  controlVel_.linear.z  = 0;  
 
  vel_speed = 1.5;
  rebackmsg = "";
  Angle_flag = 0;
 
  while (1)
  {
    
printf("connected to server/n");
if(rebackmsg != "")
{
  strcpy(buf_send, rebackmsg.c_str());
  send_len=send(client_sockfd,buf_send,strlen(buf_send),0); 
          rebackmsg = "";
}         rec_len=recv(client_sockfd,buf_send,BUFSIZ1,0);
        recivemsg = buf_send; if(recivemsg != "")
{
  printf("%s",buf_send);
}        if(recivemsg.find("SetAngle") != -1)
{
             strcpy(str, recivemsg.c_str());
            char *p = strstr(str, "SetAngle_");
             sscanf(p+strlen("SetAngle_"),"%d",&Angle);
             Angle_flag = 1;
                     }        if(recivemsg.find("SetSpeedHIGH") != -1)
{
             vel_speed = 1.5;
             rebackmsg = "RESPABBSETAGVSPEED#FBYAAH2WV7V4VNPGUHY1,SetSpeedHIGHOK*";        }
        else if(recivemsg.find("SetSpeedMEDIUM") != -1)
{
             vel_speed = 2.5;
             rebackmsg = "RESPABBSETAGVSPEED#FBYAAH2WV7V4VNPGUHY1,SetSpeedHIGHOK*";        }
        else if(recivemsg.find("SetSpeedLOW") != -1)
{
             vel_speed = 3.5;
             rebackmsg = "RESPABBSETAGVSPEED#FBYAAH2WV7V4VNPGUHY1,SetSpeedHIGHOK*";        } if(recivemsg != "")
{
  recivemsg = "";
} if(Angle_flag)
{
           if(Angle > 180)
           {
             int angle_change;
             angle_change =Angle-360;
             Angle = angle_change;
           }
   vel_angle_ = vel_angle_max*(Angle/180);       
   controlVel_.angular.z = vel_angle_;       
   controlVel_.linear.x  = vel_speed;  
   controlVel_.linear.y  = 0;  
   controlVel_.linear.z  = 0;
  vel_pub_.publish(controlVel_); 
          Angle = 0;
          Angle_flag = 0;
}

    
        
    //根据前面定义的频率, sleep 1s
    loop_rate.sleep();
}
  return 0;
}