36 #include <visp3/core/vpServer.h>
41 #ifdef VISP_HAVE_FUNC_INET_NTOP
43 #include <visp3/core/vpDebug.h>
45 #if defined(__APPLE__) && defined(__MACH__)
46 #include <TargetConditionals.h>
56 emitter.socketFileDescriptorEmitter = socket(AF_INET, SOCK_STREAM, protocol);
57 #if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
58 if (
emitter.socketFileDescriptorEmitter < 0)
60 if (
emitter.socketFileDescriptorEmitter == INVALID_SOCKET)
65 emitter.emitterAddress.sin_family = AF_INET;
66 emitter.emitterAddress.sin_addr.s_addr = INADDR_ANY;
67 emitter.emitterAddress.sin_port = 0;
69 adress = inet_ntoa(
emitter.emitterAddress.sin_addr);
70 port =
emitter.emitterAddress.sin_port;
81 emitter.socketFileDescriptorEmitter = socket(AF_INET, SOCK_STREAM, protocol);
82 #if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
83 if (
emitter.socketFileDescriptorEmitter < 0)
85 if (
emitter.socketFileDescriptorEmitter == INVALID_SOCKET)
88 vpERROR_TRACE(
"vpServer::vpServer(const int &port_serv), cannot open socket.");
90 emitter.emitterAddress.sin_family = AF_INET;
91 emitter.emitterAddress.sin_addr.s_addr = INADDR_ANY;
92 emitter.emitterAddress.sin_port = htons((
unsigned short)port_serv);
94 adress = inet_ntoa(
emitter.emitterAddress.sin_addr);
105 : adress(), port(0), started(false), max_clients(10)
108 emitter.socketFileDescriptorEmitter = socket(AF_INET, SOCK_STREAM, protocol);
109 #if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
110 if (
emitter.socketFileDescriptorEmitter < 0)
112 if (
emitter.socketFileDescriptorEmitter == INVALID_SOCKET)
115 vpERROR_TRACE(
"vpServer::vpServer(const std::string &adress_serv,const "
116 "int &port_serv), cannot open socket.");
118 emitter.emitterAddress.sin_family = AF_INET;
119 emitter.emitterAddress.sin_addr.s_addr = inet_addr(adress_serv.c_str());
120 emitter.emitterAddress.sin_port = htons((
unsigned short)port_serv);
122 adress = adress_serv;
131 #if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
132 close(
emitter.socketFileDescriptorEmitter);
134 closesocket((
unsigned)
emitter.socketFileDescriptorEmitter);
138 #
if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
141 closesocket((
unsigned)
receptor_list[i].socketFileDescriptorReceptor);
152 int serverStructLength =
sizeof(
emitter.emitterAddress);
153 #if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
154 int bindResult = bind(
emitter.socketFileDescriptorEmitter, (
struct sockaddr *)&
emitter.emitterAddress,
155 (
unsigned)serverStructLength);
157 int bindResult = bind((
unsigned)
emitter.socketFileDescriptorEmitter, (
struct sockaddr *)&
emitter.emitterAddress,
161 if (bindResult < 0) {
162 std::cout <<
"Error id : " << bindResult << std::endl;
163 std::stringstream errorMessage;
164 errorMessage <<
"vpServer::vpServer(), cannot bind to port";
166 errorMessage << port;
167 errorMessage <<
" The port may be already used.";
176 if (
emitter.socketFileDescriptorEmitter > 0) {
179 setsockopt(
emitter.socketFileDescriptorEmitter, SOL_SOCKET, SO_NOSIGPIPE, &set_option,
sizeof(set_option))) {
182 std::cout <<
"Failed to set socket signal option" << std::endl;
187 #if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
188 listen(
emitter.socketFileDescriptorEmitter, (
int)max_clients);
190 listen((
unsigned)
emitter.socketFileDescriptorEmitter, (
int)max_clients);
193 std::cout <<
"Server ready" << std::endl;
214 #ifdef TARGET_OS_IPHONE
240 else if (value == 0) {
245 vpNetwork::vpReceptor client;
246 client.receptorAddressSize =
sizeof(client.receptorAddress);
247 #if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
248 client.socketFileDescriptorReceptor = accept(
249 emitter.socketFileDescriptorEmitter, (
struct sockaddr *)&client.receptorAddress, &client.receptorAddressSize);
251 client.socketFileDescriptorReceptor =
252 accept((
unsigned int)
emitter.socketFileDescriptorEmitter, (
struct sockaddr *)&client.receptorAddress,
253 &client.receptorAddressSize);
256 #if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
257 if ((client.socketFileDescriptorReceptor) == -1)
259 if ((client.socketFileDescriptorReceptor) == INVALID_SOCKET)
263 client.receptorIP = inet_ntoa(client.receptorAddress.sin_addr);
264 printf(
"New client connected : %s\n", inet_ntoa(client.receptorAddress.sin_addr));
273 #if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
274 ssize_t numbytes = recv(
receptor_list[i].socketFileDescriptorReceptor, &deco, 1, MSG_PEEK);
276 int numbytes = recv((
unsigned int)
receptor_list[i].socketFileDescriptorReceptor, &deco, 1, MSG_PEEK);
280 std::cout <<
"Disconnected : " << inet_ntoa(
receptor_list[i].receptorAddress.sin_addr) << std::endl;
297 #elif !defined(VISP_BUILD_SHARED_LIBS)
299 void dummy_vpServer() { };
fd_set readFileDescriptor
std::vector< vpReceptor > receptor_list
void print(const char *id="")
virtual ~vpServer() VP_OVERRIDE
bool checkForConnections()