116 lines
2.8 KiB
C++
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);
|
|
}
|
|
}
|
|
|