diff --git a/.gitignore b/.gitignore index 254defd..9e6363d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,8 @@ server +.vscode +.DS_Store +package.jpg +assets +package.mp4 +avServer_test +avServer diff --git a/assets/test.jpg b/assets/test.jpg new file mode 100755 index 0000000..ffaa9af Binary files /dev/null and b/assets/test.jpg differ diff --git a/assets/test1.jpg b/assets/test1.jpg new file mode 100755 index 0000000..ac1f05e Binary files /dev/null and b/assets/test1.jpg differ diff --git a/assets/test2.jpg b/assets/test2.jpg new file mode 100644 index 0000000..86c84b4 Binary files /dev/null and b/assets/test2.jpg differ diff --git a/avClient b/avClient new file mode 100755 index 0000000..b29a83d Binary files /dev/null and b/avClient differ diff --git a/avServer b/avServer new file mode 100755 index 0000000..42f83a6 Binary files /dev/null and b/avServer differ diff --git a/avatarClient.c b/avatarClient.c new file mode 100644 index 0000000..4b58121 --- /dev/null +++ b/avatarClient.c @@ -0,0 +1,65 @@ +// Client side C/C++ program to demonstrate Socket programming +#include +#include +#include +#include +#include +#include +#include +#define PORT 8080 + +int main(int argc, char const *argv[]) +{ + struct sockaddr_in address; + int sock = 0, message_recieved; + struct sockaddr_in serv_addr; + char buffer[1024]; + + FILE *avatar; + + if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + printf("\n Socket creation error \n"); + return -1; + } + + memset(&serv_addr, '0', sizeof(serv_addr)); + + serv_addr.sin_family = AF_INET; + serv_addr.sin_port = htons(PORT); + + // Convert IPv4 and IPv6 addresses from text to binary form + if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) + { + printf("\nInvalid address/ Address not supported \n"); + return -1; + } + + if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) + { + printf("\nConnection Failed \n"); + return -1; + } + avatar = fopen("package.mp4", "a+"); + if (avatar == NULL) + { + printf("Nie udalo się otworzyć pliku"); + return -1; + } + while (1) + { + message_recieved = recv(sock, buffer, sizeof(buffer), 0); + if (strcmp(buffer, "over") == 0) + { + fclose(avatar); + break; + } + else + { + fwrite(buffer, sizeof(char), sizeof(buffer), avatar); + } + printf("%s", "Received"); + } + + return 0; +} diff --git a/avatarServer.c b/avatarServer.c new file mode 100644 index 0000000..26a6a32 --- /dev/null +++ b/avatarServer.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define PORT 8080 + +int main(int argc, char const *argv[]) +{ + int server_fd, new_socket, read_avatar; + struct sockaddr_in address; + int opt = 1; + int addrlen = sizeof(address); + char buffer[1024]; + char *overMessage = "over"; + srand(time(NULL)); + + // Creating socket file descriptor + if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) + { + perror("socket failed"); + exit(EXIT_FAILURE); + } + + address.sin_family = AF_INET; + address.sin_addr.s_addr = INADDR_ANY; + address.sin_port = htons(PORT); + + // Forcefully attaching socket to the port 8080 + if (bind(server_fd, (struct sockaddr *)&address, + sizeof(address)) < 0) + { + perror("bind failed"); + exit(EXIT_FAILURE); + } + printf("bind\n"); + if (listen(server_fd, 3) < 0) + { + perror("listen"); + exit(EXIT_FAILURE); + } + printf("listening\n"); + if ((new_socket = accept(server_fd, (struct sockaddr *)&address, + (socklen_t *)&addrlen)) < 0) + { + perror("accept"); + exit(EXIT_FAILURE); + } + printf("accepted\n"); + int avatar_fd = open("assets/test3.mp4", O_RDONLY); + if (avatar_fd < 0) + { + return -1; + } + int start = clock(); + while ((read_avatar = read(avatar_fd, buffer, sizeof(buffer))) > 0) + { + printf("%d\n", read_avatar); + send(new_socket, buffer, sizeof(buffer), 0); + } + send(new_socket, overMessage, sizeof(overMessage), 0); + int stop = clock(); + + printf("%f", ((double)stop - start) / CLOCKS_PER_SEC); + + close(server_fd); + close(new_socket); + return 0; +} diff --git a/server.c b/server.c index eba1dee..19e0172 100644 --- a/server.c +++ b/server.c @@ -7,6 +7,8 @@ #include #include #include +#include +#include typedef struct { @@ -39,6 +41,7 @@ typedef struct void Error(int err); void *dataProcessHandler(void *data); +void *videoHandler(void *arg); int main(void) { @@ -53,7 +56,6 @@ int main(void) int sock[2]; struct sockaddr_in myAddrForClients[2]; struct sockaddr_in clients[2]; - struct sockaddr_in tmp; myAddr.sin_family = AF_INET; @@ -69,6 +71,13 @@ int main(void) myAddrForClients[0].sin_addr.s_addr = INADDR_ANY; myAddrForClients[1].sin_addr.s_addr = INADDR_ANY; + pthread_t video_thread; + if (pthread_create(&video_thread, NULL, videoHandler, NULL) < 0) + { + perror("video_thread"); + return -1; + } + for (i = 0; i < 2; i++) { if ((sock[i] = socket(AF_INET, SOCK_DGRAM, 0)) < 0) @@ -190,3 +199,63 @@ void Error(int err) { printf("Error! Code: %d\n", err); } + +void *videoHandler(void *arg) +{ + printf("video_handler\n"); + char video_buffer[1024]; + struct stat movieInfo; + int counter = 0; //Counts users that request video data + int VideoSocketTCP; + int new_socket; + int read_movie; + struct sockaddr_in video_address_tcp, reciever_address; + int addrlen = sizeof(struct sockaddr_in); + + if ((VideoSocketTCP = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + perror("tcp video socket"); + return NULL; + } + + video_address_tcp.sin_family = AF_INET; + video_address_tcp.sin_addr.s_addr = INADDR_ANY; + video_address_tcp.sin_port = htons(8989); + + if (bind(VideoSocketTCP, (struct sockaddr *)&video_address_tcp, + sizeof(video_address_tcp)) < 0) + { + perror("bind failed"); + return NULL; + } + if (listen(VideoSocketTCP, 3) < 0) + { + perror("listen"); + return NULL; + } + while (1) + { + if ((new_socket = accept(VideoSocketTCP, (struct sockaddr *)&reciever_address, + (socklen_t *)&addrlen)) < 0) + { + perror("accept"); + return NULL; + } + + int movie_open = open("assets/test4.mp4", O_RDONLY); + int movie_file_stat = fstat(movie_open, &movieInfo); + + send(new_socket, &movieInfo.st_size, sizeof(movieInfo.st_size), 0); + printf("Size sended: %lld\n", movieInfo.st_size); + + while ((read_movie = read(movie_open, video_buffer, sizeof(video_buffer))) > 0) + { + printf("%d ", read_movie); + send(new_socket, video_buffer, sizeof(video_buffer), 0); + } + } + + close(VideoSocketTCP); + close(new_socket); + return NULL; +}