Browse Source

Ported UNIX sockets to Winsock for Windows

tags/v0.6.0
Andrew Belt 7 years ago
parent
commit
00db4b2b23
2 changed files with 76 additions and 24 deletions
  1. +3
    -4
      Makefile
  2. +73
    -20
      src/bridge.cpp

+ 3
- 4
Makefile View File

@@ -37,7 +37,7 @@ endif


ifeq ($(ARCH), win) ifeq ($(ARCH), win)
SOURCES += dep/osdialog/osdialog_win.c SOURCES += dep/osdialog/osdialog_win.c
LDFLAGS += -static-libgcc -static-libstdc++ -lpthread \
LDFLAGS += -static-libgcc -static-libstdc++ -lpthread -lws2_32 \
-Wl,--export-all-symbols,--out-implib,libRack.a -mwindows \ -Wl,--export-all-symbols,--out-implib,libRack.a -mwindows \
-lgdi32 -lopengl32 -lcomdlg32 -lole32 \ -lgdi32 -lopengl32 -lcomdlg32 -lole32 \
-Ldep/lib -lglew32 -lglfw3dll -lcurl -lzip -lrtaudio -lrtmidi -lcrypto -lssl \ -Ldep/lib -lglew32 -lglfw3dll -lcurl -lzip -lrtaudio -lrtmidi -lcrypto -lssl \
@@ -61,7 +61,7 @@ ifeq ($(ARCH), mac)
endif endif
ifeq ($(ARCH), win) ifeq ($(ARCH), win)
# TODO get rid of the mingw64 path # TODO get rid of the mingw64 path
env PATH=dep/bin:/mingw64/bin ./$<
env PATH=${PATH}:dep/bin ./$<
endif endif


debug: $(TARGET) debug: $(TARGET)
@@ -72,8 +72,7 @@ ifeq ($(ARCH), mac)
DYLD_FALLBACK_LIBRARY_PATH=dep/lib gdb -ex run ./Rack DYLD_FALLBACK_LIBRARY_PATH=dep/lib gdb -ex run ./Rack
endif endif
ifeq ($(ARCH), win) ifeq ($(ARCH), win)
# TODO get rid of the mingw64 path
env PATH=dep/bin:/mingw64/bin gdb -ex run ./Rack
env PATH=${PATH}:dep/bin gdb -ex run ./Rack
endif endif


perf: $(TARGET) perf: $(TARGET)


+ 73
- 20
src/bridge.cpp View File

@@ -2,12 +2,18 @@
#include "util/common.hpp" #include "util/common.hpp"
#include "dsp/ringbuffer.hpp" #include "dsp/ringbuffer.hpp"


#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/tcp.h>
// #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#ifdef ARCH_WIN
#include <winsock2.h>
#include <ws2tcpip.h>
#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/tcp.h>
#endif



#include <thread> #include <thread>


@@ -195,7 +201,7 @@ static void clientRun(int client) {
// info("Bridge client %s connected", ipBuffer); // info("Bridge client %s connected", ipBuffer);
info("Bridge client connected"); info("Bridge client connected");


#ifndef ARCH_LIN
#ifdef ARCH_MAC
// Avoid SIGPIPE // Avoid SIGPIPE
int flag = 1; int flag = 1;
setsockopt(client, SOL_SOCKET, SO_NOSIGPIPE, &flag, sizeof(int)); setsockopt(client, SOL_SOCKET, SO_NOSIGPIPE, &flag, sizeof(int));
@@ -206,9 +212,9 @@ static void clientRun(int client) {
while (!connection.closeRequested) { while (!connection.closeRequested) {
uint8_t buffer[RECV_BUFFER_SIZE]; uint8_t buffer[RECV_BUFFER_SIZE];
#ifdef ARCH_LIN #ifdef ARCH_LIN
ssize_t received = recv(client, buffer, sizeof(buffer), MSG_NOSIGNAL);
ssize_t received = recv(client, (char*) buffer, sizeof(buffer), MSG_NOSIGNAL);
#else #else
ssize_t received = recv(client, buffer, sizeof(buffer), 0);
ssize_t received = recv(client, (char*) buffer, sizeof(buffer), 0);
#endif #endif
if (received <= 0) if (received <= 0)
break; break;
@@ -224,20 +230,56 @@ static void clientRun(int client) {
static void serverRun() { static void serverRun() {
int err; int err;


// Initialize sockets
#ifdef ARCH_WIN
WSADATA wsaData;
err = WSAStartup(MAKEWORD(2,2), &wsaData);
if (err) {
warn("Could not initialize Winsock");
return;
}
#endif

// Get address
#ifdef ARCH_WIN
struct addrinfo hints;
struct addrinfo *result = NULL;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
err = getaddrinfo(NULL, "5000", &hints, &result);
#else
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
addr.sin_port = htons(5000);
#endif
if (err) {
warn("Could not get Bridge server address");
return;
}

// Open socket // Open socket
int server = socket(AF_INET, SOCK_STREAM, 0);
if (server < 0)
#ifdef ARCH_WIN
SOCKET server = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (server == INVALID_SOCKET) {
#else
int server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (server < 0) {
#endif
warn("Bridge server socket() failed");
return; return;
}


// Bind to 127.0.0.1
const std::string host = "127.0.0.1";
const int port = 5000;
struct sockaddr_in serverAddr;
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
inet_pton(AF_INET, host.c_str(), &serverAddr.sin_addr);
serverAddr.sin_port = htons(port);
err = bind(server, (struct sockaddr*) &serverAddr, sizeof(serverAddr));
// Bind socket to address
#ifdef ARCH_WIN
err = bind(server, result->ai_addr, (int)result->ai_addrlen);
#else
err = bind(server, (struct sockaddr*) &addr, sizeof(addr));
#endif
if (err) { if (err) {
warn("Bridge server bind() failed"); warn("Bridge server bind() failed");
goto serverRun_cleanup; goto serverRun_cleanup;
@@ -252,9 +294,16 @@ static void serverRun() {
info("Bridge server started"); info("Bridge server started");


// Make server non-blocking // Make server non-blocking
#ifdef ARCH_WIN
{
unsigned long mode = 1;
ioctlsocket(server, FIONBIO, &mode);
}
#else
err = fcntl(server, F_SETFL, fcntl(server, F_GETFL, 0) | O_NONBLOCK); err = fcntl(server, F_SETFL, fcntl(server, F_GETFL, 0) | O_NONBLOCK);
serverQuit = false;
#endif


serverQuit = false;
while (!serverQuit) { while (!serverQuit) {
// Accept client socket // Accept client socket


@@ -275,6 +324,10 @@ serverRun_cleanup:
err = close(server); err = close(server);
(void) err; (void) err;
info("Bridge server closed"); info("Bridge server closed");
#ifdef ARCH_WIN
freeaddrinfo(result);
WSACleanup();
#endif
} }






Loading…
Cancel
Save