00001 /******************************************************************** 00002 Description: Class for network functions 00003 part of the 3Dsia project 00004 created: StonedBones, 31.1.2000 00005 00006 History: 00007 date, name, changes, in funtion 00008 180300 StonedBones cleaned source 00009 310100 StonedBones created source 00010 00011 ********************************************************************/ 00012 00013 #include "network.h" 00014 00015 #include <string> 00016 #include <unistd.h> 00017 00018 #include "../common/options.h" 00019 #include "../common/intToChar.h" 00020 #include "frontEnd.h" 00021 00022 /*................................................................... 00023 Description: Constructor 00024 Args: <none> 00025 Returns: <none> 00026 Created: StonedBones, 31.1.2000 00027 [ToDo:] 00028 [Comments:] 00029 - based on old 3Dsia code by Xandi 00030 Changes: 00031 - 18.03.2000 StonedBones replaced char* -> string 00032 -------------------------------------------------------------------*/ 00033 00034 Network::Network () { 00035 extern FrontEnd* frontEnd; 00036 00037 string msg; 00038 00039 frontEnd->displayDebugMessage ("Opening TCP/IP socket"); 00040 00041 if ((sock = socket (PF_INET, SOCK_STREAM, 0)) < 0) { 00042 frontEnd->displayDebugMessage ("Error: Can't open TCP/IP socket !"); 00043 exit (1); 00044 }; 00045 00046 int i = 1; 00047 setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &i, sizeof (i)); 00048 00049 address.sin_family = AF_INET; 00050 address.sin_port = htons (DEFAULT_PORT); 00051 00052 memset (&address.sin_addr, 0, sizeof (address.sin_addr)); 00053 00054 msg = "Binding TCP/IP socket to port "; 00055 msg += intToChar (DEFAULT_PORT); 00056 frontEnd->displayDebugMessage (msg.c_str ()); 00057 00058 if (bind (sock, (struct sockaddr*) &address, sizeof (address))) { 00059 frontEnd->displayDebugMessage ("Error: Can't bind TCP/IP socket !"); 00060 exit (1); 00061 }; 00062 00063 frontEnd->displayDebugMessage ("Listening for connections"); 00064 00065 if (listen (sock, 5)) { 00066 frontEnd->displayDebugMessage ("Error: Can't listen to socket !"); 00067 exit (1); 00068 }; 00069 }; 00070 00071 /*................................................................... 00072 Description: Destructor 00073 Args: <none> 00074 Returns: <none> 00075 Created: StonedBones, 31.1.2000 00076 [ToDo:] 00077 - close all open connections 00078 [Comments:] 00079 Changes: 00080 -------------------------------------------------------------------*/ 00081 00082 Network::~Network () { 00083 }; 00084 00085 /*................................................................... 00086 Description: waits until a client connects 00087 Args: <none> 00088 Returns: socket number of new client 00089 Created: StonedBones, 31.1.2000 00090 [ToDo:] 00091 [Comments:] 00092 - based on old 3Dsia code by Xandi 00093 Changes: 00094 -------------------------------------------------------------------*/ 00095 00096 int Network::waitForConnection () { 00097 extern FrontEnd* frontEnd; 00098 00099 fd_set checkIt; 00100 int clientSock = 0; 00101 00102 FD_ZERO (&checkIt); 00103 FD_SET (sock, &checkIt); 00104 00105 if (select (70, &checkIt, 0, 0, NULL) < 0) { 00106 frontEnd->displayDebugMessage ("Error in Network::waitForConnection: select !"); 00107 exit (1); 00108 }; 00109 00110 if (FD_ISSET (sock, &checkIt)) { 00111 if ((clientSock = accept (sock, (struct sockaddr*) &address, (socklen_t*) sizeof (address))) < 0) { 00112 frontEnd->displayDebugMessage ("Error in Network::waitForConnection: accept !"); 00113 exit (1); 00114 }; 00115 } else { 00116 frontEnd->displayDebugMessage ("Error in Network::waitForConnection: FD_ISSET !"); 00117 exit (1); 00118 }; 00119 00120 return clientSock; 00121 };