Skip to content

Instantly share code, notes, and snippets.

@jnovikov
Created November 10, 2018 20:09
Show Gist options
  • Save jnovikov/6844c7f2988c2f5a40dc90fdd17ddfd0 to your computer and use it in GitHub Desktop.
Save jnovikov/6844c7f2988c2f5a40dc90fdd17ddfd0 to your computer and use it in GitHub Desktop.
Easy one threaded tcp server c++ implementation
#include <cstdio>
#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main() {
int test = socket(AF_INET, SOCK_STREAM, 0);
if (test == -1) {
std::cout << "Failed to create socket" << std::endl;
return test;
}
struct sockaddr_in server_addr = {0};
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(8002);
int enable = 1;
if (setsockopt(test, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int)) < 0) {
std::cout << "Failed to set reuse option" << std::endl;
}
int err = bind(test, (struct sockaddr*)&server_addr, sizeof(server_addr));
if (err == -1) {
std::cout << "Failed to bind on " << 8001 << std::endl;
return err;
}
int backlog = 100;
err = listen(test, backlog);
if (err == -1) {
std::cout << "Failed to listen on port " << std::endl;
return err;
}
std::cout << "Listen on port: " << 8001 << std::endl;
// Обработка и взятие из очереди 1 подключения !
struct sockaddr_in client;
socklen_t client_len;
client_len = sizeof(client);
int client_sock = accept(test,(struct sockaddr*)&client, &client_len);
if (client_sock < 0) {
std::cout << "Accept failed" << std::endl;
// return ?
}
std::cout << "Accepted new connection: " << std::endl;
char c_request[50] = {0};
read(client_sock, &c_request, 50);
std::string request(c_request);
std::cout << "Request" << request << std::endl;
reverse(request.begin(),request.end());
const char* c_response = request.c_str();
write(client_sock, c_response, strlen(c_response));
if (close(client_sock) == -1) {
std::cout << "Close error " << std::endl;
}
if (close(test) == -1) {
std::cout << "Close rror " << std::endl;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment