Skip to content

Instantly share code, notes, and snippets.

@Gydo194
Created March 4, 2018 11:23
Show Gist options
  • Save Gydo194/66a3118f40835aad1318141abc8db7ca to your computer and use it in GitHub Desktop.
Save Gydo194/66a3118f40835aad1318141abc8db7ca to your computer and use it in GitHub Desktop.
more advanced c++ echo server (single client)
#include <stdio.h>
#include <string.h> //strlen
#include <stdlib.h>
#include <errno.h>
#include <unistd.h> //close
#include <arpa/inet.h> //close
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <iostream> //std::cout
#define PORT 8888
#define INPUT_BUFFER_SIZE 1024
char inputBuffer[INPUT_BUFFER_SIZE];
int listen_fd, comm_fd;
struct sockaddr_in servaddr;
int main() {
std::cout << "starting...\n";
listen_fd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof (servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htons(INADDR_ANY);
servaddr.sin_port = htons(PORT);
int opt = 1;
if (setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, (char *) &opt,
sizeof (opt)) < 0) {
perror("setsockopt failed");
exit(EXIT_FAILURE);
}
std::cout << "SOCKET FD:" << listen_fd << "\n";
std::cout << "BIND ret " << bind(listen_fd, (struct sockaddr *) &servaddr, sizeof (servaddr)) << "\n";
std::cout << "LISTEN ret " << listen(listen_fd, 10) << "\n";
comm_fd = accept(listen_fd, (struct sockaddr*) NULL, NULL);
while (1) {
bzero(inputBuffer, INPUT_BUFFER_SIZE);
int succ = read(comm_fd, inputBuffer, INPUT_BUFFER_SIZE);
std::cout << "read completed\n";
printf("read %d bytes\n", succ);
if (0 == succ) {
std::cout << "read exactly 0 bytes, client disconnected?\n";
}
printf("Echoing back: '%s'\n", inputBuffer);
std::cout << "print complete\n";
write(comm_fd, inputBuffer, strlen(inputBuffer) + 1);
std::cout << "write complete\n";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment