aboutsummaryrefslogtreecommitdiffhomepage
path: root/backends/libmmbackend.c
diff options
context:
space:
mode:
authorcbdev <cb@cbcdn.com>2019-08-10 15:30:48 +0200
committercbdev <cb@cbcdn.com>2019-08-10 15:30:48 +0200
commitcf93d280af47aea1bf8bdafa30eabb2c2de005b8 (patch)
tree9e412411ee907b0ebfcd5ddfb77fa24281d2b7ea /backends/libmmbackend.c
parent7c20eeea5b1ee8c3c93e29f92e907a14498f9b73 (diff)
downloadmidimonster-cf93d280af47aea1bf8bdafa30eabb2c2de005b8.tar.gz
midimonster-cf93d280af47aea1bf8bdafa30eabb2c2de005b8.tar.bz2
midimonster-cf93d280af47aea1bf8bdafa30eabb2c2de005b8.zip
Implement stream client connections in libmmbackend (Fixes #19)
Diffstat (limited to 'backends/libmmbackend.c')
-rw-r--r--backends/libmmbackend.c62
1 files changed, 45 insertions, 17 deletions
diff --git a/backends/libmmbackend.c b/backends/libmmbackend.c
index b27ebc5..2fd3b8b 100644
--- a/backends/libmmbackend.c
+++ b/backends/libmmbackend.c
@@ -52,7 +52,7 @@ int mmbackend_parse_sockaddr(char* host, char* port, struct sockaddr_storage* ad
return 0;
}
-int mmbackend_socket(char* host, char* port, int socktype, uint8_t listener){
+int mmbackend_socket(char* host, char* port, int socktype, uint8_t listener, uint8_t mcast){
int fd = -1, status, yes = 1;
struct addrinfo hints = {
.ai_family = AF_UNSPEC,
@@ -80,20 +80,31 @@ int mmbackend_socket(char* host, char* port, int socktype, uint8_t listener){
fprintf(stderr, "Failed to enable SO_REUSEADDR on socket\n");
}
- yes = 1;
- if(setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (void*)&yes, sizeof(yes)) < 0){
- fprintf(stderr, "Failed to enable SO_BROADCAST on socket\n");
- }
+ if(mcast){
+ yes = 1;
+ if(setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (void*)&yes, sizeof(yes)) < 0){
+ fprintf(stderr, "Failed to enable SO_BROADCAST on socket\n");
+ }
- yes = 0;
- if(setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, (void*)&yes, sizeof(yes)) < 0){
- fprintf(stderr, "Failed to disable IP_MULTICAST_LOOP on socket: %s\n", strerror(errno));
+ yes = 0;
+ if(setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, (void*)&yes, sizeof(yes)) < 0){
+ fprintf(stderr, "Failed to disable IP_MULTICAST_LOOP on socket: %s\n", strerror(errno));
+ }
}
- status = bind(fd, addr_it->ai_addr, addr_it->ai_addrlen);
- if(status < 0){
- close(fd);
- continue;
+ if(listener){
+ status = bind(fd, addr_it->ai_addr, addr_it->ai_addrlen);
+ if(status < 0){
+ close(fd);
+ continue;
+ }
+ }
+ else{
+ status = connect(fd, addr_it->ai_addr, addr_it->ai_addrlen);
+ if(status < 0){
+ close(fd);
+ continue;
+ }
}
break;
@@ -107,11 +118,11 @@ int mmbackend_socket(char* host, char* port, int socktype, uint8_t listener){
//set nonblocking
#ifdef _WIN32
- u_long mode = 1;
- if(ioctlsocket(fd, FIONBIO, &mode) != NO_ERROR){
- closesocket(fd);
- return 1;
- }
+ u_long mode = 1;
+ if(ioctlsocket(fd, FIONBIO, &mode) != NO_ERROR){
+ closesocket(fd);
+ return 1;
+ }
#else
int flags = fcntl(fd, F_GETFL, 0);
if(fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0){
@@ -123,3 +134,20 @@ int mmbackend_socket(char* host, char* port, int socktype, uint8_t listener){
return fd;
}
+
+int mmbackend_send(int fd, uint8_t* data, size_t length){
+ ssize_t total = 0, sent;
+ while(total < length){
+ sent = send(fd, data + total, length - total, 0);
+ if(sent < 0){
+ fprintf(stderr, "Failed to send: %s\n", strerror(errno));
+ return 1;
+ }
+ total += sent;
+ }
+ return 0;
+}
+
+int mmbackend_send_str(int fd, char* data){
+ return mmbackend_send(fd, (uint8_t*) data, strlen(data));
+}