00001 /******************************************************************** 00002 Description: 00003 part of the 3Dsia project 00004 created: StonedBones, 1.2.2000 00005 00006 History: 00007 date, name, changes, in funtion 00008 240400 xandi merge, code clean, bugfixes 00009 180400 StonedBones added dynamic packet length 00010 010200 StonedBones created source 00011 00012 ********************************************************************/ 00013 00014 #include <sys/time.h> 00015 #include <sys/socket.h> 00016 #include <sys/types.h> 00017 #include <stdlib.h> 00018 #include <unistd.h> 00019 #include <stdio.h> 00020 #include <string.h> 00021 #include <string> 00022 #include <pthread.h> 00023 00024 #include "protocol.h" 00025 #include "options.h" 00026 00027 #include "communication.h" 00028 00029 /*................................................................... 00030 Description: Thread that manages the incoming buffer 00031 Args: ComArgs* args: various arguments (see header-file) 00032 Returns: <none> 00033 Created: StonedBones, 1.2.2000 00034 [ToDo:] 00035 [Comments:] 00036 Changes: 00037 fixed all (i hope) bugs 230400, xandi 00038 merged server/communication & client-commthreads 00039 into common/communication 240400, xandi 00040 code cleanup 240400, xandi 00041 -------------------------------------------------------------------*/ 00042 00043 void* IncomingThread (void* argz) 00044 { 00045 ComArgs* args = (ComArgs*) argz; 00046 fd_set checkIt; 00047 00048 Buffer* myBuffer = args->buffer; 00049 int mySocket = args->socket; 00050 00051 if (myBuffer == 0) 00052 { 00053 fprintf(stderr,"[comT.incoming] PANIK!! my buffer is not existing!\n"); 00054 exit(1); 00055 } 00056 00057 fprintf(stderr,"[comT.incoming] Incoming Thread started for socket %d\n",args->socket); 00058 00059 FD_ZERO (&checkIt); 00060 FD_SET (mySocket, &checkIt); 00061 00062 if (select (70, &checkIt, 0, 0, NULL) < 0) 00063 { 00064 fprintf (stderr,"[comT.incoming] error: select (not critical)"); 00065 } 00066 00067 while (1) 00068 { 00069 packet* pak = new packet; 00070 00071 #ifdef DEBUG 00072 fprintf(stderr,"[comT.incoming] I am waiting on socket %d....\n",mySocket); 00073 #endif 00074 if (FD_ISSET (mySocket, &checkIt)) 00075 { 00076 packet_header tmpH; 00077 00078 unsigned int temp = read (mySocket, &tmpH, sizeof (packet_header) ); 00079 char* tmpCh = new char[tmpH.length]; 00080 00081 temp += read (mySocket, tmpCh, tmpH.length ); 00082 00083 #ifdef DEBUG 00084 fprintf ( stderr,"[comT.incoming] received %d bytes\n",temp); 00085 #endif 00086 00087 if ( temp == ( tmpH.length + sizeof (packet_header ) ) ) 00088 { 00089 pak->h = tmpH; 00090 pak->data.assign (tmpCh, tmpH.length); 00091 myBuffer->write (pak); 00092 00093 #ifdef DEBUG 00094 fprintf(stderr,"[comT.incoming] packet (type %d, size = %d) written into buffer...\n",pak->h.header[0],tmpH.length); 00095 #endif 00096 } 00097 else 00098 { 00099 fprintf(stderr,"[comT.incoming] seems read was not successful..\n"); 00100 break; 00101 } 00102 } 00103 else 00104 { 00105 fprintf(stderr,"[comT.incoming] FD_ISSET gave false...\n"); 00106 break; 00107 } 00108 } 00109 00110 fprintf(stderr,"[comT.incoming] Thread terminated\n"); 00111 packet* pak = new packet; 00112 pak->h.header[0] = PROT_KILL_CLIENT; 00113 myBuffer->write (pak); 00114 pthread_exit (NULL); 00115 } 00116 00117 /*................................................................... 00118 Description: Thread that manages the outgoing buffer 00119 Args: ComArgs* args: various arguments (see header-files) 00120 Returns: <none> 00121 Created: StonedBones, 1.2.2000 00122 [ToDo:] 00123 [Comments:] 00124 Changes: 00125 -------------------------------------------------------------------*/ 00126 00127 void* OutgoingThread (void* argz) 00128 { 00129 ComArgs* args = (ComArgs*) argz; 00130 Buffer* myBuffer = args->buffer; 00131 int mySocket = args->socket; 00132 00133 if ( !myBuffer ) 00134 { 00135 fprintf(stderr,"[comT.outgoing] PANIK!! my buffer is not existing!\n"); 00136 exit(1); 00137 } 00138 00139 fprintf(stderr,"[comT.outgoing] OutgoingThread started for socket %d\n",mySocket); 00140 00141 while (1) 00142 { 00143 if (!myBuffer->isEmpty ()) 00144 { 00145 packet* pak = myBuffer->read (); 00146 00147 // if ( !pak->data.length() ) //TEMP!!!!!!!!!!! 00148 // pak->data = "x"; //TEMP!!!!!!!!!!! 00149 00150 if (pak->h.header[0] == PROT_KILL_CLIENT) 00151 pthread_exit (NULL); 00152 00153 #ifdef DEBUG 00154 fprintf(stderr,"[comT.outgoing] sending a package..\n"); 00155 #endif 00156 00157 packet_header tmpH = pak->h; 00158 tmpH.length = pak->data.length (); 00159 const char* tmpCh = pak->data.data (); 00160 00161 unsigned int temp; 00162 temp = write ( mySocket, &tmpH, sizeof (packet_header) ); 00163 temp += write ( mySocket, tmpCh, tmpH.length ); 00164 00165 if ( temp != ( sizeof (packet_header) + tmpH.length ) ) 00166 { 00167 fprintf (stderr,"[comT.outgoing] Error: write\n"); 00168 pthread_exit (NULL); 00169 } 00170 00171 #ifdef DEBUG 00172 fprintf(stderr,"[comT.outoing] %d bytes sent\n", tmpH.length); 00173 #endif 00174 delete pak; 00175 pak = 0; 00176 } 00177 } 00178 } 00179