CPP/Sockets
From ProgrammingExamples
< CPP
(Taken from here with non-trivial modifications: http://www.linuxhowtos.org/C_C++/socket.htm)
First run
server 51717
Then run (while 'server' is still running):
client localhost 51717
The client will ask you to type a message. Do this, and press enter. You will see the message appear in the server window!
client.cpp
#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <cstdlib> #include <cstring> // includes bzero #include <fstream> #include <iostream> int main(int argc, char *argv[]) { int sockfd, portno, n; struct sockaddr_in serv_addr; struct hostent *server; char buffer[256]; if (argc < 3) { fprintf(stderr,"usage %s hostname port\n", argv[0]); exit(0); } portno = atoi(argv[2]); sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { std::cout << "ERROR opening socket" << std::endl; exit(-1); } server = gethostbyname(argv[1]); if (server == NULL) { fprintf(stderr,"ERROR, no such host\n"); exit(0); } bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); serv_addr.sin_port = htons(portno); if (connect(sockfd,(sockaddr*)(&serv_addr),sizeof(serv_addr)) < 0) { std::cout << "ERROR connecting" << std::endl; exit(-1); } printf("Please enter the message: "); bzero(buffer,256); fgets(buffer,255,stdin); n = write(sockfd,buffer,strlen(buffer)); if (n < 0) { std::cout << "ERROR writing to socket" << std::endl; exit(-1); } bzero(buffer,256); n = read(sockfd,buffer,255); if (n < 0) { std::cout << "ERROR reading from socket" << std::endl; } printf("%s\n",buffer); return 0; }
server.cpp
/* A simple server in the internet domain using TCP The port number is passed as an argument */ #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <cstdlib> #include <cstring> // includes bzero #include <iterator> #include <iostream> int main(int argc, char *argv[]) { int sockfd, newsockfd, portno, clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; int n; if (argc < 2) { fprintf(stderr,"ERROR, no port provided\n"); exit(1); } sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { std::cout << "ERROR opening socket" << std::endl; exit(-1); } bzero((char *) &serv_addr, sizeof(serv_addr)); portno = atoi(argv[1]); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { std::cout << "ERROR on binding" << std::endl; exit(-1); } listen(sockfd,5); clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t*)(&clilen)); if (newsockfd < 0) { std::cout << "ERROR on accept" << std::endl; exit(-1); } bzero(buffer,256); n = read(newsockfd,buffer,255); if (n < 0) { std::cout << "ERROR reading from socket" << std::endl; exit(-1); } printf("Here is the message: %s\n",buffer); n = write(newsockfd,"I got your message",18); if (n < 0) { std::cout << "ERROR writing to socket" << std::endl; exit(-1); } return 0; }
CMakeLists.txt
cmake_minimum_required(VERSION 2.6) Project(Sockets) ADD_EXECUTABLE(server server.cpp) ADD_EXECUTABLE(client client.cpp)