Loading CMakeLists.txt +1 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) add_subdirectory(prrt) add_library(PRRT prrt/prrt_socket.c) add_library(PRRT prrt/socket.c) add_executable(sender sender.c) add_executable(receiver receiver.c) Loading defines.h 0 → 100644 +8 −0 Original line number Diff line number Diff line // // Created by root on 05.11.15. // #ifndef PRRT_DEFINES_H #define PRRT_DEFINES_H #endif //PRRT_DEFINES_H prrt/prrt_socket.cdeleted 100644 → 0 +0 −71 Original line number Diff line number Diff line #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> #include <sys/types.h> #include <sys/socket.h> #include "prrt_socket.h" int prrt_socket() { int fd; if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("cannot create socket"); return -1; } return fd; } int prrt_connect() { return 0; } int prrt_bind(int fd, int port) { struct sockaddr_in address; memset((char*) &address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_addr.s_addr = htonl(INADDR_ANY); address.sin_port = htons(port); return bind(fd, (struct sockaddr *) &address, sizeof(address)); } int prrt_send(int fd, const void * data, size_t data_len) { // TODO: should iterate over receivers struct hostent *hp; char *host = "localhost"; struct sockaddr_in targetaddr; memset((char*) &targetaddr, 0, sizeof(targetaddr)); targetaddr.sin_family = AF_INET; targetaddr.sin_port = htons(5000); // TODO: make port flexible hp = gethostbyname(host); memcpy((void *)&targetaddr.sin_addr, hp->h_addr_list[0], hp->h_length); if((sendto(fd, data, data_len, 0, (struct sockaddr *) &targetaddr, sizeof(targetaddr)) < 0)) { perror("sendto failed"); return -1; } return 0; } int prrt_recv(int fd, void * bufin, size_t length) { int n; struct sockaddr_in remote; socklen_t addrlen = sizeof(remote); n = recvfrom(fd, bufin,length, 0, (struct sockaddr *) &remote, &addrlen); printf("got a datagram from %s port %d\n", inet_ntoa(remote.sin_addr), ntohs(remote.sin_port)); return n; } int prrt_close(int fd) { close(fd); return 0; } prrt/prrt_socket.hdeleted 100644 → 0 +0 −11 Original line number Diff line number Diff line #ifndef PRRT_SOCKET #define PRRT_SOCKET int prrt_socket(void); int prrt_close(int fd); int prrt_bind(int fd, int port); int prrt_connect(); int prrt_send(int fd, const void * data, size_t data_len); int prrt_recv(int fd, void * bufin, size_t length); #endif prrt/socket.c 0 → 100644 +124 −0 Original line number Diff line number Diff line #include <netdb.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include "socket.h" int prrt_create_socket(prrt_socket *sock, uint16_t port) { // Create Data Socket if((sock->fd_data = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("cannot create socket"); return -1; } // Bind Data Socket struct sockaddr_in address; memset((char*) &address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_addr.s_addr = htonl(INADDR_ANY); address.sin_port = htons(port); if(bind(sock->fd_data, (struct sockaddr *) &address, sizeof(address)) < 0) { perror("cannot bind socket"); return -1; } // Create Feedback Socket if((sock->fd_feedback = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("cannot create socket"); return -1; } // Bind Feedback Socket memset((char*) &address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_addr.s_addr = htonl(INADDR_ANY); address.sin_port = htons((uint16_t) (port + 1)); // TODO: fail if port is 65535 if(bind(sock->fd_feedback, (struct sockaddr *) &address, sizeof(address)) < 0) { perror("cannot bind socket"); return -1; } return 0; } int prrt_connect(prrt_socket *sock, char *host, size_t host_len, uint16_t port) { return 0; } int prrt_send(prrt_socket *sock, const void *data, size_t data_len) { // TODO: should iterate over receivers struct hostent *hp; char *host = "localhost"; // TODO make receiver flexible struct sockaddr_in targetaddr; memset((char*) &targetaddr, 0, sizeof(targetaddr)); targetaddr.sin_family = AF_INET; targetaddr.sin_port = htons(5000); // TODO: make port flexible hp = gethostbyname(host); memcpy((void *)&targetaddr.sin_addr, hp->h_addr_list[0], hp->h_length); if((sendto(sock->fd_data, data, data_len, 0, (struct sockaddr *) &targetaddr, sizeof(targetaddr)) < 0)) { perror("sendto failed"); return -1; } return 0; } ssize_t prrt_recv(prrt_socket *sock, void *bufin, size_t length) { // RECEIVE DATA ssize_t n; struct sockaddr_in remote; socklen_t addrlen = sizeof(remote); n = recvfrom(sock->fd_data, bufin, length, 0, (struct sockaddr *) &remote, &addrlen); uint16_t remote_port = ntohs(remote.sin_port); char *remote_host = inet_ntoa(remote.sin_addr); printf("got a datagram from %s port %d\n", remote_host, remote_port); // REPLY struct sockaddr_in targetaddr; memset((char*) &targetaddr, 0, sizeof(targetaddr)); targetaddr.sin_family = AF_INET; targetaddr.sin_port = htons(remote_port + 1); struct hostent *hp; hp = gethostbyname(remote_host); memcpy((void *)&targetaddr.sin_addr, hp->h_addr_list[0], hp->h_length); if((sendto(sock->fd_data, bufin, n, 0, (struct sockaddr *) &targetaddr, sizeof(targetaddr)) < 0)) { perror("sendto failed"); return -1; } return n; } int prrt_close_socket(prrt_socket *sock) { close(sock->fd_data); close(sock->fd_feedback); return 0; } ssize_t prrt_recv_feedback(prrt_socket *sock, void *bufin, size_t length) { printf("RECEIVING FB"); ssize_t n; struct sockaddr_in remote; socklen_t addrlen = sizeof(remote); n = recvfrom(sock->fd_feedback, bufin, length, 0, (struct sockaddr *) &remote, &addrlen); uint16_t remote_port = ntohs(remote.sin_port); char *remote_host = inet_ntoa(remote.sin_addr); printf("got feedback from %s port %d\n", remote_host, remote_port); return n; } Loading
CMakeLists.txt +1 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) add_subdirectory(prrt) add_library(PRRT prrt/prrt_socket.c) add_library(PRRT prrt/socket.c) add_executable(sender sender.c) add_executable(receiver receiver.c) Loading
defines.h 0 → 100644 +8 −0 Original line number Diff line number Diff line // // Created by root on 05.11.15. // #ifndef PRRT_DEFINES_H #define PRRT_DEFINES_H #endif //PRRT_DEFINES_H
prrt/prrt_socket.cdeleted 100644 → 0 +0 −71 Original line number Diff line number Diff line #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> #include <sys/types.h> #include <sys/socket.h> #include "prrt_socket.h" int prrt_socket() { int fd; if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("cannot create socket"); return -1; } return fd; } int prrt_connect() { return 0; } int prrt_bind(int fd, int port) { struct sockaddr_in address; memset((char*) &address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_addr.s_addr = htonl(INADDR_ANY); address.sin_port = htons(port); return bind(fd, (struct sockaddr *) &address, sizeof(address)); } int prrt_send(int fd, const void * data, size_t data_len) { // TODO: should iterate over receivers struct hostent *hp; char *host = "localhost"; struct sockaddr_in targetaddr; memset((char*) &targetaddr, 0, sizeof(targetaddr)); targetaddr.sin_family = AF_INET; targetaddr.sin_port = htons(5000); // TODO: make port flexible hp = gethostbyname(host); memcpy((void *)&targetaddr.sin_addr, hp->h_addr_list[0], hp->h_length); if((sendto(fd, data, data_len, 0, (struct sockaddr *) &targetaddr, sizeof(targetaddr)) < 0)) { perror("sendto failed"); return -1; } return 0; } int prrt_recv(int fd, void * bufin, size_t length) { int n; struct sockaddr_in remote; socklen_t addrlen = sizeof(remote); n = recvfrom(fd, bufin,length, 0, (struct sockaddr *) &remote, &addrlen); printf("got a datagram from %s port %d\n", inet_ntoa(remote.sin_addr), ntohs(remote.sin_port)); return n; } int prrt_close(int fd) { close(fd); return 0; }
prrt/prrt_socket.hdeleted 100644 → 0 +0 −11 Original line number Diff line number Diff line #ifndef PRRT_SOCKET #define PRRT_SOCKET int prrt_socket(void); int prrt_close(int fd); int prrt_bind(int fd, int port); int prrt_connect(); int prrt_send(int fd, const void * data, size_t data_len); int prrt_recv(int fd, void * bufin, size_t length); #endif
prrt/socket.c 0 → 100644 +124 −0 Original line number Diff line number Diff line #include <netdb.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include "socket.h" int prrt_create_socket(prrt_socket *sock, uint16_t port) { // Create Data Socket if((sock->fd_data = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("cannot create socket"); return -1; } // Bind Data Socket struct sockaddr_in address; memset((char*) &address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_addr.s_addr = htonl(INADDR_ANY); address.sin_port = htons(port); if(bind(sock->fd_data, (struct sockaddr *) &address, sizeof(address)) < 0) { perror("cannot bind socket"); return -1; } // Create Feedback Socket if((sock->fd_feedback = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("cannot create socket"); return -1; } // Bind Feedback Socket memset((char*) &address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_addr.s_addr = htonl(INADDR_ANY); address.sin_port = htons((uint16_t) (port + 1)); // TODO: fail if port is 65535 if(bind(sock->fd_feedback, (struct sockaddr *) &address, sizeof(address)) < 0) { perror("cannot bind socket"); return -1; } return 0; } int prrt_connect(prrt_socket *sock, char *host, size_t host_len, uint16_t port) { return 0; } int prrt_send(prrt_socket *sock, const void *data, size_t data_len) { // TODO: should iterate over receivers struct hostent *hp; char *host = "localhost"; // TODO make receiver flexible struct sockaddr_in targetaddr; memset((char*) &targetaddr, 0, sizeof(targetaddr)); targetaddr.sin_family = AF_INET; targetaddr.sin_port = htons(5000); // TODO: make port flexible hp = gethostbyname(host); memcpy((void *)&targetaddr.sin_addr, hp->h_addr_list[0], hp->h_length); if((sendto(sock->fd_data, data, data_len, 0, (struct sockaddr *) &targetaddr, sizeof(targetaddr)) < 0)) { perror("sendto failed"); return -1; } return 0; } ssize_t prrt_recv(prrt_socket *sock, void *bufin, size_t length) { // RECEIVE DATA ssize_t n; struct sockaddr_in remote; socklen_t addrlen = sizeof(remote); n = recvfrom(sock->fd_data, bufin, length, 0, (struct sockaddr *) &remote, &addrlen); uint16_t remote_port = ntohs(remote.sin_port); char *remote_host = inet_ntoa(remote.sin_addr); printf("got a datagram from %s port %d\n", remote_host, remote_port); // REPLY struct sockaddr_in targetaddr; memset((char*) &targetaddr, 0, sizeof(targetaddr)); targetaddr.sin_family = AF_INET; targetaddr.sin_port = htons(remote_port + 1); struct hostent *hp; hp = gethostbyname(remote_host); memcpy((void *)&targetaddr.sin_addr, hp->h_addr_list[0], hp->h_length); if((sendto(sock->fd_data, bufin, n, 0, (struct sockaddr *) &targetaddr, sizeof(targetaddr)) < 0)) { perror("sendto failed"); return -1; } return n; } int prrt_close_socket(prrt_socket *sock) { close(sock->fd_data); close(sock->fd_feedback); return 0; } ssize_t prrt_recv_feedback(prrt_socket *sock, void *bufin, size_t length) { printf("RECEIVING FB"); ssize_t n; struct sockaddr_in remote; socklen_t addrlen = sizeof(remote); n = recvfrom(sock->fd_feedback, bufin, length, 0, (struct sockaddr *) &remote, &addrlen); uint16_t remote_port = ntohs(remote.sin_port); char *remote_host = inet_ntoa(remote.sin_addr); printf("got feedback from %s port %d\n", remote_host, remote_port); return n; }