Advertisement
Guest User

Untitled

a guest
Dec 10th, 2012
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.79 KB | None | 0 0
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <iostream>
  4.  
  5. #include <netdb.h>  // use getprotobyname
  6. #include <arpa/inet.h>  // use inet_pton
  7. #include <cerrno>   // for errorno
  8. #include <cstring>  // for errorstring
  9. #include <netinet/in.h>
  10.  
  11. // how many connections will wait in queue?
  12. #define CONNECTION_QUEUE_COUNT 10
  13.  
  14. #define SERVER_IP_ADDRESS "127.0.0.1" // bind to localhost
  15. #define SERVER_PORT 6666 // port to bind to
  16.  
  17. /**
  18.     Obtains tcp socket via socket()
  19.     @author Filip Sivák <sivakfil@fel.cvut.cz>
  20.     @throws int 1, if socket fails
  21.  */
  22. int getTcpSocket() {
  23.     int sock;
  24.     sock = socket(PF_INET, SOCK_STREAM, getprotobyname("tcp")->p_proto);
  25.     if( sock < 0 ) throw 1;
  26.     return sock;  
  27. }
  28.  
  29.  
  30. /**
  31.     Obtains sockaddr_in via inet_pton
  32.     @author: Filip Sivák <sivakfil@fel.cvut.cz>
  33.  */
  34. struct sockaddr_in getAddress(const char address, int port) {
  35.     struct sockaddr_in ip4;
  36.    
  37.     ip4.sin_family = AF_INET;
  38.     ip4.sin_port = htons( port ); // hostByteOrder --> networkByteOrder
  39.     ip4.sin_addr.s_addr = inet_addr( &address );
  40.     return ip4;
  41. }
  42.  
  43. /**
  44.     Binds given socket to given address
  45.     You should obtain address by getAddress()
  46.     @throws 2 if error occurs during bind
  47.     @author Filip Sivák<sivakfil@fel.cvut.cz>
  48. */
  49. void doBind(int socket, struct sockaddr_in address) {
  50.     int binded = 0;
  51.     binded = bind(socket, (struct sockaddr *)&address, sizeof address);
  52.     if(binded != 0) {
  53.         throw 2;
  54.     }
  55. }
  56.  
  57. /**
  58.     Accepts incoming connections
  59.     @param sockaddr_storage *incoming_addr - pointer to incoming address
  60.                      that will be set
  61.     @throw error no. 3 on error
  62.     @returns socket file descriptor of incoming connection
  63.  */
  64. int  doAccept(int socket, struct sockaddr_storage *incoming_addr) {
  65.     int accepted;
  66.    
  67.     socklen_t addrSize;
  68.     addrSize = sizeof incoming_addr;
  69.    
  70.     accepted = accept(socket, (struct sockaddr *) incoming_addr, &addrSize);
  71.     if(accepted == -1) {
  72.         throw 3;
  73.     }else {
  74.         return accepted;
  75.     }
  76. }
  77.  
  78. int main(void) {
  79.     try {
  80.         int socket = getTcpSocket();
  81.         std::cout << "Yo! I have a socket for you: " << socket << "\n";
  82.    
  83.         struct sockaddr_in socketAddress;
  84.         const char *addr = SERVER_IP_ADDRESS;
  85.         socketAddress = getAddress(*addr, SERVER_PORT);
  86.        
  87.         doBind( socket, socketAddress );
  88.  
  89.         std::cout << "Yo! I have binded your socket esse!\n";
  90.  
  91.         int listenError = listen( socket, CONNECTION_QUEUE_COUNT );
  92.         if(listenError == -1) throw 4;
  93.        
  94.         std::cout << "Yo Homie! I'm listening. Taalk to me! \n";
  95.  
  96.         struct sockaddr_storage incoming_addr;
  97.         int socketIncoming = doAccept(socket, &incoming_addr);
  98.  
  99.         std::cout << "Hi Hi Hi mr.: " << socketIncoming << "! \n";
  100.  
  101.     }catch(int errorNo) {
  102.         std::cout << "-----------------------\n";
  103.         std::cout << "Error with no: " << errorNo << " occured!\n";
  104.         std::cout << "Error: " << std::strerror(errno) << " \n";
  105.     }
  106.    
  107.     return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement