Merge commit '12d91378e5fe126b85141123aefb27a4c33f96e2'
This commit is contained in:
commit
bb33724873
@ -4,36 +4,22 @@
|
|||||||
#include <winsock2.h>
|
#include <winsock2.h>
|
||||||
#include <ws2tcpip.h>
|
#include <ws2tcpip.h>
|
||||||
#pragma comment(lib, "ws2_32.lib")
|
#pragma comment(lib, "ws2_32.lib")
|
||||||
|
|
||||||
#elif defined(__unix__) || defined(__APPLE__)
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <fcntl.h> // For fcntl
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace RoboidControl {
|
namespace RoboidControl {
|
||||||
namespace Windows {
|
namespace Windows {
|
||||||
|
|
||||||
void Setup(int localPort, const char* remoteIpAddress, int remotePort) {
|
void ParticipantUDP::Setup(int localPort, const char* remoteIpAddress, int remotePort) {
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
|
||||||
// Create a UDP socket
|
// Create a UDP socket
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
|
||||||
// Windows-specific Winsock initialization
|
// Windows-specific Winsock initialization
|
||||||
WSADATA wsaData;
|
WSADATA wsaData;
|
||||||
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
|
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
|
||||||
std::cerr << "WSAStartup failed" << std::endl;
|
std::cerr << "WSAStartup failed" << std::endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
|
||||||
this->sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
this->sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||||
#elif defined(__unix__) || defined(__APPLE__)
|
|
||||||
this->sock = socket(AF_INET, SOCK_DGRAM, 0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (this->sock < 0) {
|
if (this->sock < 0) {
|
||||||
std::cerr << "Error creating socket" << std::endl;
|
std::cerr << "Error creating socket" << std::endl;
|
||||||
@ -41,13 +27,8 @@ void Setup(int localPort, const char* remoteIpAddress, int remotePort) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set the socket to non-blocking mode
|
// Set the socket to non-blocking mode
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
|
||||||
u_long mode = 1; // 1 to enable non-blocking socket
|
u_long mode = 1; // 1 to enable non-blocking socket
|
||||||
ioctlsocket(this->sock, FIONBIO, &mode);
|
ioctlsocket(this->sock, FIONBIO, &mode);
|
||||||
#elif defined(__unix__) || defined(__APPLE__)
|
|
||||||
int flags = fcntl(this->sock, F_GETFL, 0);
|
|
||||||
fcntl(this->sock, F_SETFL, flags | O_NONBLOCK);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (remotePort != 0) {
|
if (remotePort != 0) {
|
||||||
// Set up the address to send to
|
// Set up the address to send to
|
||||||
@ -56,12 +37,8 @@ void Setup(int localPort, const char* remoteIpAddress, int remotePort) {
|
|||||||
remote_addr.sin_port = htons((u_short)remotePort);
|
remote_addr.sin_port = htons((u_short)remotePort);
|
||||||
if (inet_pton(AF_INET, remoteIpAddress, &remote_addr.sin_addr) <= 0) {
|
if (inet_pton(AF_INET, remoteIpAddress, &remote_addr.sin_addr) <= 0) {
|
||||||
std::cerr << "Invalid address" << std::endl;
|
std::cerr << "Invalid address" << std::endl;
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
|
||||||
closesocket(sock);
|
closesocket(sock);
|
||||||
WSACleanup();
|
WSACleanup();
|
||||||
#elif defined(__unix__) || defined(__APPLE__)
|
|
||||||
close(sock);
|
|
||||||
#endif
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -72,30 +49,22 @@ void Setup(int localPort, const char* remoteIpAddress, int remotePort) {
|
|||||||
server_addr.sin_port = htons((u_short)localPort);
|
server_addr.sin_port = htons((u_short)localPort);
|
||||||
if (inet_pton(AF_INET, "0.0.0.0", &server_addr.sin_addr) <= 0) {
|
if (inet_pton(AF_INET, "0.0.0.0", &server_addr.sin_addr) <= 0) {
|
||||||
std::cerr << "Invalid address" << std::endl;
|
std::cerr << "Invalid address" << std::endl;
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
|
||||||
closesocket(sock);
|
closesocket(sock);
|
||||||
WSACleanup();
|
WSACleanup();
|
||||||
#elif defined(__unix__) || defined(__APPLE__)
|
|
||||||
close(sock);
|
|
||||||
#endif
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bind the socket to the specified port
|
// Bind the socket to the specified port
|
||||||
if (bind(this->sock, (const struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
|
if (bind(this->sock, (const struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
|
||||||
std::cerr << "Bind failed" << std::endl;
|
std::cerr << "Bind failed" << std::endl;
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
|
||||||
closesocket(sock);
|
closesocket(sock);
|
||||||
WSACleanup();
|
WSACleanup();
|
||||||
#elif defined(__unix__) || defined(__APPLE__)
|
|
||||||
close(sock);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif // _WIN32 || _WIN64
|
||||||
}
|
}
|
||||||
|
|
||||||
void Receive() {
|
void ParticipantUDP::Receive() {
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
// char ip_str[INET_ADDRSTRLEN];
|
// char ip_str[INET_ADDRSTRLEN];
|
||||||
// inet_ntop(AF_INET, &(server_addr.sin_addr), ip_str, INET_ADDRSTRLEN);
|
// inet_ntop(AF_INET, &(server_addr.sin_addr), ip_str, INET_ADDRSTRLEN);
|
||||||
@ -103,21 +72,13 @@ void Receive() {
|
|||||||
// << ntohs(server_addr.sin_port) << "\n";
|
// << ntohs(server_addr.sin_port) << "\n";
|
||||||
|
|
||||||
sockaddr_in client_addr;
|
sockaddr_in client_addr;
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
|
||||||
int len = sizeof(client_addr);
|
int len = sizeof(client_addr);
|
||||||
#elif defined(__unix__) || defined(__APPLE__)
|
|
||||||
socklen_t len = sizeof(client_addr);
|
|
||||||
#endif
|
|
||||||
int packetSize = recvfrom(this->sock, buffer, sizeof(buffer), 0, (struct sockaddr*)&client_addr, &len);
|
int packetSize = recvfrom(this->sock, buffer, sizeof(buffer), 0, (struct sockaddr*)&client_addr, &len);
|
||||||
// std::cout << "received data " << packetSize << "\n";
|
// std::cout << "received data " << packetSize << "\n";
|
||||||
if (packetSize < 0) {
|
if (packetSize < 0) {
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
|
||||||
int error_code = WSAGetLastError(); // Get the error code on Windows
|
int error_code = WSAGetLastError(); // Get the error code on Windows
|
||||||
if (error_code != WSAEWOULDBLOCK)
|
if (error_code != WSAEWOULDBLOCK)
|
||||||
std::cerr << "recvfrom failed with error: " << error_code << std::endl;
|
std::cerr << "recvfrom failed with error: " << error_code << std::endl;
|
||||||
#else
|
|
||||||
// std::cerr << "recvfrom failed with error: " << packetSize << std::endl;
|
|
||||||
#endif
|
|
||||||
} else if (packetSize > 0) {
|
} else if (packetSize > 0) {
|
||||||
char sender_ipAddress[INET_ADDRSTRLEN];
|
char sender_ipAddress[INET_ADDRSTRLEN];
|
||||||
inet_ntop(AF_INET, &(client_addr.sin_addr), sender_ipAddress, INET_ADDRSTRLEN);
|
inet_ntop(AF_INET, &(client_addr.sin_addr), sender_ipAddress, INET_ADDRSTRLEN);
|
||||||
@ -138,16 +99,16 @@ void Receive() {
|
|||||||
|
|
||||||
// ReceiveData(packetSize, remoteParticipant);
|
// ReceiveData(packetSize, remoteParticipant);
|
||||||
}
|
}
|
||||||
#endif
|
#endif // _WIN32 || _WIN64
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Send(Participant* remoteParticipant, int bufferSize) {
|
bool ParticipantUDP::Send(Participant* remoteParticipant, int bufferSize) {
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
char ip_str[INET_ADDRSTRLEN];
|
char ip_str[INET_ADDRSTRLEN];
|
||||||
inet_ntop(AF_INET, &(remote_addr.sin_addr), ip_str, INET_ADDRSTRLEN);
|
inet_ntop(AF_INET, &(remote_addr.sin_addr), ip_str, INET_ADDRSTRLEN);
|
||||||
std::cout << "Send to " << ip_str << ":" << ntohs(remote_addr.sin_port) << "\n";
|
std::cout << "Send to " << ip_str << ":" << ntohs(remote_addr.sin_port) << "\n";
|
||||||
int sent_bytes = sendto(sock, this->buffer, bufferSize, 0, (struct sockaddr*)&remote_addr, sizeof(remote_addr));
|
int sent_bytes = sendto(sock, this->buffer, bufferSize, 0, (struct sockaddr*)&remote_addr, sizeof(remote_addr));
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
|
||||||
if (sent_bytes <= SOCKET_ERROR) {
|
if (sent_bytes <= SOCKET_ERROR) {
|
||||||
int error_code = WSAGetLastError(); // Get the error code on Windows
|
int error_code = WSAGetLastError(); // Get the error code on Windows
|
||||||
std::cerr << "sendto failed with error: " << error_code << std::endl;
|
std::cerr << "sendto failed with error: " << error_code << std::endl;
|
||||||
@ -155,18 +116,11 @@ bool Send(Participant* remoteParticipant, int bufferSize) {
|
|||||||
WSACleanup();
|
WSACleanup();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#elif defined(__unix__) || defined(__APPLE__)
|
#endif // _WIN32 || _WIN64
|
||||||
if (sent_bytes < 0) {
|
|
||||||
std::cerr << "sendto failed with error: " << sent_bytes << std::endl;
|
|
||||||
close(sock);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Publish(IMessage* msg) {
|
bool ParticipantUDP::Publish(IMessage* msg) {
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
int bufferSize = msg->Serialize(this->buffer);
|
int bufferSize = msg->Serialize(this->buffer);
|
||||||
if (bufferSize <= 0)
|
if (bufferSize <= 0)
|
||||||
@ -176,7 +130,7 @@ bool Publish(IMessage* msg) {
|
|||||||
inet_ntop(AF_INET, &(broadcast_addr.sin_addr), ip_str, INET_ADDRSTRLEN);
|
inet_ntop(AF_INET, &(broadcast_addr.sin_addr), ip_str, INET_ADDRSTRLEN);
|
||||||
std::cout << "Publish to " << ip_str << ":" << ntohs(broadcast_addr.sin_port) << "\n";
|
std::cout << "Publish to " << ip_str << ":" << ntohs(broadcast_addr.sin_port) << "\n";
|
||||||
int sent_bytes = sendto(sock, this->buffer, bufferSize, 0, (struct sockaddr*)&broadcast_addr, sizeof(broadcast_addr));
|
int sent_bytes = sendto(sock, this->buffer, bufferSize, 0, (struct sockaddr*)&broadcast_addr, sizeof(broadcast_addr));
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
|
||||||
if (sent_bytes <= SOCKET_ERROR) {
|
if (sent_bytes <= SOCKET_ERROR) {
|
||||||
int error_code = WSAGetLastError(); // Get the error code on Windows
|
int error_code = WSAGetLastError(); // Get the error code on Windows
|
||||||
std::cerr << "sendto failed with error: " << error_code << std::endl;
|
std::cerr << "sendto failed with error: " << error_code << std::endl;
|
||||||
@ -184,14 +138,7 @@ bool Publish(IMessage* msg) {
|
|||||||
WSACleanup();
|
WSACleanup();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#elif defined(__unix__) || defined(__APPLE__)
|
#endif // _WIN32 || _WIN64
|
||||||
if (sent_bytes < 0) {
|
|
||||||
std::cerr << "sendto failed with error: " << sent_bytes << std::endl;
|
|
||||||
close(sock);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
// #include <ws2tcpip.h>
|
// #include <ws2tcpip.h>
|
||||||
|
|
||||||
#include "Participant.h"
|
#include "Participant.h"
|
||||||
#include "SiteServer.h"
|
#include "Participants/SiteServer.h"
|
||||||
#include "Thing.h"
|
#include "Thing.h"
|
||||||
|
|
||||||
using namespace RoboidControl;
|
using namespace RoboidControl;
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
// not supported using Visual Studio 2022 compiler...
|
// not supported using Visual Studio 2022 compiler...
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
#include "LocalParticipant.h"
|
#include "Participants/ParticipantUDP.h"
|
||||||
#include "Thing.h"
|
#include "Thing.h"
|
||||||
|
|
||||||
using namespace RoboidControl;
|
using namespace RoboidControl;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user