This repository has been archived on 2024-09-18. You can view files and clone it, but cannot push or open issues or pull requests.
sdp-scheduler/remote_listener.cpp
2022-11-19 10:21:39 +03:00

116 lines
2.8 KiB
C++

#include <sys/poll.h>
#include <netinet/in.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sys/socket.h>
#include <unistd.h>
#define PORT 40000
static int server_fd;
static struct sockaddr_in sock_address;
static void createServer() {
int opt = 1;
// Creating socket file descriptor
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// // Forcefully attaching socket to the port 8080
// if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
// perror("setsockopt");
// exit(EXIT_FAILURE);
// }
sock_address.sin_family = AF_INET;
sock_address.sin_addr.s_addr = INADDR_ANY;
sock_address.sin_port = htons(PORT);
// Forcefully attaching socket to the port
if (bind(server_fd, (sockaddr*)&sock_address, sizeof(sock_address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
}
int openSocket() {
int sock;
int addrlen = sizeof(sock_address);
if ((sock = accept(server_fd, (sockaddr*)&sock_address, (socklen_t*)&addrlen)) < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
return sock;
}
static struct pollfd fdList[2];
int main() {
createServer();
fdList[0].fd = STDIN_FILENO;
fdList[0].events = POLLIN;
while (true) {
int sock = openSocket();
printf("Connected fd=%d\n", sock);
fdList[1].fd = sock;
fdList[1].events = POLLIN;
while (true) {
if (poll(fdList, 2, -1) < 1) {
continue;
}
if (fdList[1].revents & POLLNVAL) {
printf("POLLNVAL\n");
break;
}
if (fdList[1].revents & POLLHUP) {
printf("closed by peer\n");
close(fdList[1].fd);
break;
}
if (fdList[1].revents & POLLIN) {
char buff[1024];
ssize_t size = read(fdList[1].fd, buff, sizeof(buff));
if (size < 0) {
printf("closed by peer\n");
break;
}
write(STDOUT_FILENO, buff, size);
}
// получены данные из STDIN
if (fdList[0].revents & POLLIN) {
char buff[1024];
ssize_t size = read(fdList[0].fd, buff, sizeof(buff));
if (size < 0) {
printf("stdin EOL\n");
return 0;
}
write(fdList[1].fd, buff, size);
}
}
// closing the connected socket
close(sock);
// closing the listening socket
shutdown(server_fd, SHUT_RDWR);
}
}