Ip.cc
Go to the documentation of this file.
1 
37 #include "Ip.hh"
38 #include "Messages.hh"
39 #include "crc.h"
40 
41 #include <iostream>
42 
43 int Ip::Bind()
44 {
45 #if WIN32
46  int PeerLength = sizeof(struct sockaddr_in);
47  int ClientLength = sizeof(struct sockaddr_in);
48 #else
49  socklen_t PeerLength = sizeof(struct sockaddr_in);
50  socklen_t ClientLength = sizeof(struct sockaddr_in);
51 #endif
52 
53  if (m_SockFd < 0) {
54  std::cerr << "Error: Invalid Socket Descriptor\n";
55  return -1;
56  }
57 
58  m_ClientAddress.sin_family = AF_INET;
59  m_ClientAddress.sin_addr.s_addr = 0;
60  m_ClientAddress.sin_port = 0;
61 
62  m_ServerAddress.sin_family = AF_INET;
63  m_ServerAddress.sin_addr.s_addr = inet_addr(m_IpAddress.c_str());
64  m_ServerAddress.sin_port = htons(Messages::SERVER_PORT);
65 
67  long int bSent = sendto(m_SockFd, (char *)&MsgSetup, sizeof(MsgSetup), 0,
68  (struct sockaddr *)&m_ServerAddress, ClientLength);
69  if ((sizeof(Messages::MessageSetup) != bSent) || (bSent < 0))
70  {
71  std::cerr << "Error Failed to Send Setup Message\n";
72  if (bSent < 0)
73  {
74  std::cerr << SOCKET_ERRNO << std::endl;
75  }
76  else
77  {
78  std::cerr << "Byte mismatch! Expected: " << sizeof(Messages::MessageSetup);
79  std::cerr << " Sent: " << bSent << std::endl;
80  }
81  return -1;
82  }
83 
84  long int bRead = recvfrom(m_SockFd, (char *)&MsgSetup, sizeof(Messages::MessageSetup), 0,
85  (struct sockaddr *)&m_ServerAddress, &PeerLength);
86  if (sizeof(Messages::MessageSetup) != bRead|| (bRead < 0))
87  {
88  std::cerr << "Error Failed to Receive Setup Message\n";
89  if (bRead < 0)
90  {
91  std::cerr << SOCKET_ERRNO << std::endl;
92  }
93  else
94  {
95  std::cerr << "Byte mismatch Expected: " << sizeof(Messages::MessageSetup);
96  std::cerr << " Received: " << bRead << std::endl;
97  }
98  return -1;
99  }
100 
101  memcpy(&m_ClientAddress, &MsgSetup.ClientAddress, sizeof(struct sockaddr_in));
102 
103  std::cout << "Info: Bound to client\n";
104  std::cout << "Server Address: " << inet_ntoa(m_ServerAddress.sin_addr) << std::endl;
105  std::cout << "Server Port: " << m_ServerAddress.sin_port << std::endl;
106  std::cout << "Client Address: " << inet_ntoa(m_ClientAddress.sin_addr) << std::endl;
107  std::cout << "Client Port: " << m_ClientAddress.sin_port << std::endl;
108 
109  return 0;
110 
111 }
112 
113 int Ip::Setup(std::string _IpAddress)
114 {
115  int so_sendbuf = 1024*1024*16;
116  int so_recvbuf = 1024*1024*16;
117  int so_reuse = 1;
118  int ret = 0;
119 
120  m_IpAddress = _IpAddress;
121 
122 
123 #ifdef WIN32
124  WSADATA wsaData;
125  ret = WSAStartup(MAKEWORD(2, 2), &wsaData);
126  if (ret != NO_ERROR) {
127  std::cerr << "Failed to init windows socket API!\n";
128  std::cerr << SOCKET_ERRNO << std::endl;
129  return -1;
130  }
131 #endif
132 
133 
134  m_SockFd = socket(AF_INET, SOCK_DGRAM, 0);
135  if (m_SockFd < 0) {
136  std::cerr << "Failed to create udp socket!\n";
137  std::cerr << SOCKET_ERRNO << std::endl;
138  return -1;
139  }
140 
141  ret = setsockopt(m_SockFd, SOL_SOCKET, SO_SNDBUF, (char *)&so_sendbuf, sizeof(so_sendbuf));
142  if (ret < 0) {
143  std::cerr << "Failed to set socket option sendbuf size: " << so_sendbuf << std::endl;
144  std::cerr << SOCKET_ERRNO << std::endl;
146  return ret;
147  }
148 
149  ret = setsockopt(m_SockFd, SOL_SOCKET, SO_RCVBUF, (char*)&so_recvbuf, sizeof(so_recvbuf));
150  if (ret < 0) {
151  std::cerr << "Failed to set socket option recvbuf size: " << so_recvbuf << std::endl;
152  std::cerr << SOCKET_ERRNO << std::endl;
154  return ret;
155  }
156 
157  ret = setsockopt(m_SockFd, SOL_SOCKET, SO_REUSEADDR, (char*)&so_reuse, sizeof(so_reuse));
158  if (ret < 0) {
159  std::cerr << "Failed to set socket option reuseaddr\n";
160  std::cerr << SOCKET_ERRNO << std::endl;
161  return ret;
162  }
163 
164 #if WIN32
165  // Milliseconds
166  DWORD tv = 1000;
167 #else
168  struct timeval tv;
169  tv.tv_sec = 1;
170  tv.tv_usec = 000000;
171 #endif // WIN32
172 
173  if (setsockopt(m_SockFd, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv)) == -1){
174  std::cerr << "Couldn't set socket timeout\n" << std::endl;
175  std::cerr << SOCKET_STR_ERR << std::endl;
176  return -1;
177  }
178 
179  return 0;
180 }
crc.h
Messages::SERVER_PORT
static CRL_CONSTEXPR int SERVER_PORT
Definition: Messages.hh:61
Ip::Setup
int Setup(std::string _IpAddress)
Definition: Ip.cc:113
Ip::m_SockFd
socket_t m_SockFd
Definition: Ip.hh:107
Messages.hh
Messages::MessageSetup
Definition: Messages.hh:148
Ip::m_IpAddress
std::string m_IpAddress
Definition: Ip.hh:110
SOCKET_STR_ERR
#define SOCKET_STR_ERR
Definition: Legacy/include/MultiSense/details/utility/Portability.hh:101
Ip.hh
closesocket
#define closesocket
Definition: Legacy/include/MultiSense/details/utility/Portability.hh:103
Ip::m_ClientAddress
struct sockaddr_in m_ClientAddress
Definition: Ip.hh:108
SOCKET_ERRNO
#define SOCKET_ERRNO
Definition: Legacy/include/MultiSense/details/utility/Portability.hh:100
Ip::Bind
int Bind()
Definition: Ip.cc:43
Ip::m_ServerAddress
struct sockaddr_in m_ServerAddress
Definition: Ip.hh:109


multisense_lib
Author(s):
autogenerated on Thu Apr 17 2025 02:49:09