Re: Some simple c++ network library?
@2 and 4, how did you even discover this information? I doubt Philip ever told us what network library he used. I guarantee you he used winsock.
@Rastislav Kiss, you can make an echo server using C using POSIX. Problem in this is that it only works on POSIX-based systems. Either way it looks like this:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>
#define MAX_ENQUEUED 20 #define BUF_LEN 256 #define PORT_STR "12321" /* ------------------------------------------------------------ */ /* How to clean up after dead child processes */ /* ------------------------------------------------------------ */ void wait_for_zombie(int s) { while(waitpid(-1, NULL, WNOHANG) > 0) ; } /* ------------------------------------------------------------ */ /* Core of implementation of a child process */ /* ------------------------------------------------------------ */ void echo_lines(int csock) { char buf[BUF_LEN]; int r; while( (r = read(csock, buf, BUF_LEN)) > 0 ) { (void)write(csock, buf, r); } exit(EXIT_SUCCESS); } /* ------------------------------------------------------------ */ /* Core of implementation of the parent process */ /* ------------------------------------------------------------ */ void take_connections_forever(int ssock) { for(;;) { struct sockaddr addr; socklen_t addr_size = sizeof(addr); int csock; /* Block until we take one connection to the server socket */ csock = accept(ssock, &addr, &addr_size); /* If it was a successful connection, spawn a worker process to service it */ if ( csock == -1 ) { perror("accept"); } else if ( fork() == 0 ) { close(ssock); echo_lines(csock); } else { close(csock); } } } /* ------------------------------------------------------------ */ /* The server process's one-off setup code */ /* ------------------------------------------------------------ */ int main() { struct addrinfo hints, *res; struct sigaction sa; int sock; /* Look up the address to bind to */ memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; if ( getaddrinfo(NULL, PORT_STR, &hints, &res) != 0 ) { perror("getaddrinfo"); exit(EXIT_FAILURE); } /* Make a socket */ if ( (sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1 ) { perror("socket"); exit(EXIT_FAILURE); } /* Arrange to clean up child processes (the workers) */ sa.sa_handler = wait_for_zombie; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; if ( sigaction(SIGCHLD, &sa, NULL) == -1 ) { perror("sigaction"); exit(EXIT_FAILURE); } /* Associate the socket with its address */ if ( bind(sock, res->ai_addr, res->ai_addrlen) != 0 ) { perror("bind"); exit(EXIT_FAILURE); } freeaddrinfo(res); /* State that we've opened a server socket and are listening for connections */ if ( listen(sock, MAX_ENQUEUED) != 0 ) { perror("listen"); exit(EXIT_FAILURE); } /* Serve the listening socket until killed */ take_connections_forever(sock); return EXIT_SUCCESS; }
Or you can use sockets with Boost.Asio:
//compile with g++ main.cpp -lboost_system -pthread
#include <boost/asio.hpp>
int main()
{
boost::asio::io_service io_service;
boost::asio::ip::tcp::socket sock(io_service);
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query("localhost", "4321");
boost::asio::connect(sock, resolver.resolve(query));
boost::asio::write(sock, boost::asio::buffer("Hello world socket\r\n"));
return 0;
}
or even:
//compile with g++ main.cpp -lboost_system -pthread
#include <boost/asio.hpp>
using namespace boost::asio;
int main()
{
io_service io_service;
ip::tcp::socket sock(io_service);
ip::tcp::resolver resolver(io_service);
ip::tcp::resolver::query query("localhost", "4321");
connect(sock, resolver.resolve(query));
write(sock, buffer("Hello world socket\r\n"));
return 0;
}
There are many other ways to do this. (I got this material from http://rosettacode.org/wiki/Echo_server and http://rosettacode.org/wiki/Sockets); go to http://rosettacode.org/wiki/Category:C++ for other ideas.
_______________________________________________ Audiogames-reflector mailing list Audiogames-reflector@sabahattin-gucukoglu.com https://sabahattin-gucukoglu.com/cgi-bin/mailman/listinfo/audiogames-reflector