美文网首页
ROS-I simple_message 源码分析:TcpCli

ROS-I simple_message 源码分析:TcpCli

作者: play_robot | 来源:发表于2019-03-22 16:35 被阅读0次

TcpClient同样继承自TcpSocket类,完成的是TCP客户端的功能。

namespace industrial
{
namespace tcp_client
{

class TcpClient : public industrial::tcp_socket::TcpSocket
{
public:

  TcpClient();
  ~TcpClient();

  bool init(char *buff, int port_num);

  // Overrides
  bool makeConnect();
};

} //tcp_client
} //industrial
init
bool TcpClient::init(char *buff, int port_num)
{

  int rc;
  bool rtn;
  int disableNodeDelay = 1;
  addrinfo *result;
  addrinfo hints = {};

  rc = SOCKET(AF_INET, SOCK_STREAM, 0);
  if (this->SOCKET_FAIL != rc)
  {
    this->setSockHandle(rc);

    // The set no delay disables the NAGEL algorithm
    rc = SET_NO_DELAY(this->getSockHandle(), disableNodeDelay);
    if (this->SOCKET_FAIL == rc)
    {
      LOG_WARN("Failed to set no socket delay, sending data can be delayed by up to 250ms");
    }

    // Initialize address data structure
    memset(&this->sockaddr_, 0, sizeof(this->sockaddr_));
    this->sockaddr_.sin_family = AF_INET;

    // Check for 'buff' as hostname, and use that, otherwise assume IP address
    hints.ai_family = AF_INET;  // Allow IPv4
    hints.ai_socktype = SOCK_STREAM;  // TCP socket
    hints.ai_flags = 0;  // No flags
    hints.ai_protocol = 0;  // Any protocol
    hints.ai_canonname = NULL;
    hints.ai_addr = NULL;
    hints.ai_next = NULL;
    if (0 == GETADDRINFO(buff, NULL, &hints, &result))
    {
      this->sockaddr_ = *((sockaddr_in *)result->ai_addr);
    }
    else 
    {
      this->sockaddr_.sin_addr.s_addr = INET_ADDR(buff);
    }
    this->sockaddr_.sin_port = HTONS(port_num);

    rtn = true;

  }
  else
  {
    LOG_ERROR("Failed to create socket, rc: %d", rc);
    rtn = false;
  }
  return rtn;
}

以上为客户端初始化代码,主要是配置通信参数:禁用Nagle算法,转换IP地址,端口号至socket数据结构。

makeConnect
bool TcpClient::makeConnect()
{
  bool rtn = false;
  int rc = this->SOCKET_FAIL;
  SOCKLEN_T addrSize = 0;

  if (!this->isConnected())
  {
    addrSize = sizeof(this->sockaddr_);
    rc = CONNECT(this->getSockHandle(), (sockaddr *)&this->sockaddr_, addrSize);
    if (this->SOCKET_FAIL != rc)
    {
      LOG_INFO("Connected to server");
      this->setConnected(true);
      rtn = true;
    }
    else
    {
      this->logSocketError("Failed to connect to server", rc, errno);
      rtn = false;
    }
  }

  else
  {
    LOG_WARN("Tried to connect when socket already in connected state");
  }

  return rtn;

}

客户端的连接代码是简单的,调用connect尝试连接即可。

相关文章

网友评论

      本文标题:ROS-I simple_message 源码分析:TcpCli

      本文链接:https://www.haomeiwen.com/subject/oqhrvqtx.html