34#include <visp3/core/vpConfig.h>
38#if defined(WINRT) || defined(_WIN32)
39#ifndef _WINSOCK_DEPRECATED_NO_WARNINGS
40#define _WINSOCK_DEPRECATED_NO_WARNINGS
45#ifdef VISP_HAVE_FUNC_INET_NTOP
47#include <visp3/core/vpNetwork.h>
48#include <visp3/core/vpDebug.h>
56#ifdef TARGET_OS_IPHONE
67 WSAStartup(MAKEWORD(2, 0), &WSAData);
99 WSAStartup(MAKEWORD(2, 0), &WSAData);
125 bool alreadyHas =
false;
134 std::cout <<
"Server already has one request with the similar ID. "
135 "Request hasn't been added."
150 for (
unsigned int i = 0; i <
request_list.size(); i++) {
166 std::cout <<
id << i <<
" : " << inet_ntoa(
receptor_list[i].receptorAddress.sin_addr) << std::endl;
180 struct hostent *server = gethostbyname(name);
182 if (server ==
nullptr) {
183 std::string noSuchHostMessage(
"ERROR, ");
184 noSuchHostMessage.append(name);
185 noSuchHostMessage.append(
": no such host\n");
186 vpERROR_TRACE(noSuchHostMessage.c_str(),
"vpNetwork::getReceptorIndex()");
190 std::string ip = inet_ntoa(*(in_addr *)server->h_addr);
192 for (
int i = 0; i < static_cast<int>(
receptor_list.size()); i++) {
193 if (
receptor_list[
static_cast<unsigned int>(i)].receptorIP == ip)
232 int sizeMinusOne =
static_cast<int>(
receptor_list.size() - 1);
233 if (size == 0 || dest >
static_cast<unsigned int>(sizeMinusOne)) {
235 vpTRACE(
"Cannot Send Request! Bad Index");
241 if (req.
size() != 0) {
244 for (
unsigned int i = 1; i < req.
size(); i++) {
253#if defined(__linux__)
254 flags = MSG_NOSIGNAL;
257#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
258 int value =
static_cast<int>(sendto(
receptor_list[dest].socketFileDescriptorReceptor, message.c_str(), message.size(), flags,
261 int value = sendto(
static_cast<unsigned int>(
receptor_list[dest].socketFileDescriptorReceptor), message.c_str(),
static_cast<int>(message.size()),
323 privReceiveRequest();
324 return privHandleRequests();
346 privReceiveRequestFrom(receptorEmitting);
347 return privHandleRequests();
370 privReceiveRequestOnce();
371 return privHandleFirstRequest();
397 privReceiveRequestOnceFrom(receptorEmitting);
398 return privHandleFirstRequest();
418 for (
unsigned int i = 0; i < res.size(); i++)
420 request_list[
static_cast<unsigned int>(res[i])]->decode();
445 for (
unsigned int i = 0; i < res.size(); i++) {
447 request_list[
static_cast<unsigned int>(res[i])]->decode();
526std::vector<int> vpNetwork::privHandleRequests()
528 std::vector<int> resIndex;
529 int index = privHandleFirstRequest();
531 while (index != -1) {
532 resIndex.push_back(index);
533 index = privHandleFirstRequest();
549int vpNetwork::privHandleFirstRequest()
555 if (indStart == std::string::npos && indSep == std::string::npos && indEnd == std::string::npos) {
565 if (indStart == std::string::npos || indSep == std::string::npos || indEnd == std::string::npos)
568 if (indEnd < indStart) {
576 if (indStart2 != std::string::npos && indStart2 < indEnd) {
583 size_t deb = indStart +
beginning.size();
587 bool hasBeenFound =
false;
592 indRequest =
static_cast<int>(
i);
600 vpTRACE(
"No request corresponds to the received message");
604 size_t indDebParam = indSep +
separator.size();
608 while (indEndParam != std::string::npos || indEndParam < indEnd) {
609 param =
currentMessageReceived.substr(
static_cast<unsigned int>(indDebParam),
static_cast<unsigned int>(indEndParam - indDebParam));
610 request_list[
static_cast<unsigned int>(indRequest)]->addParameter(param);
611 indDebParam = indEndParam +
param_sep.size();
616 request_list[
static_cast<unsigned int>(indRequest)]->addParameter(param);
636void vpNetwork::privReceiveRequest()
638 while (privReceiveRequestOnce() > 0) {
659void vpNetwork::privReceiveRequestFrom(
const unsigned int &receptorEmitting)
661 while (privReceiveRequestOnceFrom(receptorEmitting) > 0) {
683int vpNetwork::privReceiveRequestOnce()
692#ifdef TARGET_OS_IPHONE
717 else if (value == 0) {
725#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
732 std::cout <<
"Disconnected : " << inet_ntoa(
receptor_list[i].receptorAddress.sin_addr) << std::endl;
738 std::string returnVal(buf,
static_cast<unsigned int>(numbytes));
771int vpNetwork::privReceiveRequestOnceFrom(
const unsigned int &receptorEmitting)
774 int sizeMinusOne =
static_cast<int>(
receptor_list.size()) - 1;
775 if (size == 0 || receptorEmitting >
static_cast<unsigned int>(sizeMinusOne)) {
777 vpTRACE(
"No receptor at the specified index!");
782#ifdef TARGET_OS_IPHONE
800 else if (value == 0) {
807#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
810 numbytes = recv(
static_cast<unsigned int>(
receptor_list[receptorEmitting].socketFileDescriptorReceptor), buf,
814 std::cout <<
"Disconnected : " << inet_ntoa(
receptor_list[receptorEmitting].receptorAddress.sin_addr)
821 std::string returnVal(buf,
static_cast<unsigned int>(numbytes));
831#elif !defined(VISP_BUILD_SHARED_LIBS)
833void dummy_vpNetwork() { }
vpNetwork & operator=(const vpNetwork &network)
std::vector< int > receiveAndDecodeRequestFrom(const unsigned int &receptorEmitting)
int sendRequest(vpRequest &req)
fd_set readFileDescriptor
std::string currentMessageReceived
int sendAndEncodeRequestTo(vpRequest &req, const unsigned int &dest)
std::vector< vpRequest * > request_list
int sendAndEncodeRequest(vpRequest &req)
int receiveAndDecodeRequestOnce()
std::vector< int > receiveRequest()
int sendRequestTo(vpRequest &req, const unsigned int &dest)
std::vector< vpReceptor > receptor_list
void addDecodingRequest(vpRequest *)
std::vector< int > receiveRequestFrom(const unsigned int &receptorEmitting)
std::vector< int > receiveAndDecodeRequest()
void removeDecodingRequest(const char *)
int receiveAndDecodeRequestOnceFrom(const unsigned int &receptorEmitting)
void print(const char *id="")
int receiveRequestOnceFrom(const unsigned int &receptorEmitting)
int getReceptorIndex(const char *name)
unsigned int max_size_message
This the request that will transit on the network.
std::string getId() const
unsigned int size() const