22
33// Adds client's fd to list of client fds and
44// spawns a new ClientHandler thread for it
5- void * Multiplex (void * arg ) {
5+ void * Multiplex (void * arg )
6+ {
7+
68 Multiplexer * mux = (Multiplexer * )arg ;
7- while (1 ) {
9+ while (1 )
10+ {
811 int clientSocketFd = accept ((mux -> conn )-> socketFd , NULL , NULL );
9- if (clientSocketFd > 0 ) {
12+ if (clientSocketFd > 0 )
13+ {
1014 fprintf (stderr , " accepted new client. Socket: %d\n" , clientSocketFd );
1115 // Obtain lock on clients list and add new client in
1216 pthread_mutex_lock (mux -> clientListMutex );
13- if ((mux -> conn )-> numClients < MAX_BUFFER ) {
17+ if ((mux -> conn )-> numClients < MAX_BUFFER )
18+ {
1419 // Add new client to list
15- for (int i = 0 ; i < MAX_BUFFER ; i ++ ) {
16- if (!FD_ISSET ((mux -> conn )-> clientSockets [i ], & (mux -> readFds ))) {
20+ for (int i = 0 ; i < MAX_BUFFER ; i ++ )
21+ {
22+ if (!FD_ISSET ((mux -> conn )-> clientSockets [i ], & (mux -> readFds )))
23+ {
1724 (mux -> conn )-> clientSockets [i ] = clientSocketFd ;
1825 i = MAX_BUFFER ;
1926 }
@@ -24,13 +31,15 @@ void *Multiplex(void *arg) {
2431
2532 pthread_t clientThread ;
2633 if ((pthread_create (& clientThread , NULL , (void * )& ClientHandler ,
27- (void * )mux )) == 0 ) {
34+ (void * )mux )) == 0 )
35+ {
2836 (mux -> conn )-> numClients ++ ;
2937 fprintf (stderr ,
3038 "Client connection to server has been successfully "
3139 "multiplexed on socket: %d\n" ,
3240 clientSocketFd );
33- } else
41+ }
42+ else
3443 close (clientSocketFd );
3544 }
3645 pthread_mutex_unlock (mux -> clientListMutex );
@@ -39,28 +48,35 @@ void *Multiplex(void *arg) {
3948}
4049
4150// ClientHandler - Listens for payloads from client to add to queue
42- void * ClientHandler (void * arg ) {
51+ void * ClientHandler (void * arg )
52+ {
4353 Multiplexer * mux = (Multiplexer * )arg ;
4454
4555 Queue * q = mux -> Queue ;
4656 int clientSocketFd = mux -> clientSocketFd ;
4757 char * header = malloc (PROTOCOL_HEADER_LEN + 1 );
4858 int n ;
49- while ((n = read (clientSocketFd , header , PROTOCOL_HEADER_LEN )) > 1 ) {
59+ while ((n = read (clientSocketFd , header , PROTOCOL_HEADER_LEN )) > 1 )
60+ {
5061 uint16_t magic = ExtractMessageMagic (header );
51- if (magic == 0xC0DE ) {
62+ if (magic == 0xC0DE )
63+ {
5264 uint16_t protocol = ExtractMessageProtocol (header );
5365 uint32_t payload_size = ExtractMessageBodySize (header );
5466 char * recv_buffer = malloc (payload_size );
5567 read (clientSocketFd , recv_buffer , payload_size );
56- if (strcmp (recv_buffer , "/exit\n" ) == 0 ) {
68+ if (strcmp (recv_buffer , "/exit\n" ) == 0 )
69+ {
5770 fprintf (stderr , "Client on socket %d has disconnected.\n" ,
5871 clientSocketFd );
5972 Disconnect (mux , clientSocketFd );
6073 return NULL ;
61- } else {
74+ }
75+ else
76+ {
6277 // Wait for Queue to not be full before pushing message
63- while (q -> full ) {
78+ while (q -> full )
79+ {
6480 pthread_cond_wait (q -> notFull , q -> mutex );
6581 }
6682 pthread_mutex_lock (q -> mutex );
@@ -71,7 +87,32 @@ void *ClientHandler(void *arg) {
7187 message .protocol = protocol ;
7288 message .size = payload_size ;
7389 message .body = recv_buffer ;
74- Push (q , clientSocketFd , message );
90+ if (message .protocol == ERROR_MESSAGE )
91+ {
92+ fprintf (stderr , "[DEBUG] Client on Socket [%d] send server error message [%s] \n" , message .message_sender , message .body );
93+ }
94+ else
95+ {
96+ // change dir
97+ if (message .protocol == CHANGE_DIR_REQUEST || message .protocol == UPLOAD_REQUEST )
98+ {
99+ fprintf (stderr , "[DEBUG] srv upload msg protocol[%s] \n" , message .body );
100+
101+ char payload [MAX_BUFFER ];
102+ char * arr_ptr = & payload [0 ];
103+ int payload_length = strlen (arr_ptr );
104+ char * reply = malloc (strlen (arr_ptr ) + PROTOCOL_HEADER_LEN );
105+ int mesg_length = MarshallMessage (reply , 0xC0DE , READY_REPLY , arr_ptr );
106+ if (send (message .message_sender , reply , strlen (arr_ptr ) + PROTOCOL_HEADER_LEN , 0 ) == -1 )
107+ perror ("write failed: " );
108+ fprintf (stderr , "[DEBUG] Upload Handler Server : Replying back .... \n" );
109+ }
110+
111+ else
112+ {
113+ Push (q , clientSocketFd , message );
114+ }
115+ }
75116 }
76117 pthread_mutex_unlock (q -> mutex );
77118 pthread_cond_signal (q -> notEmpty );
@@ -80,10 +121,13 @@ void *ClientHandler(void *arg) {
80121}
81122
82123// Removes the socket from the list of active client sockets and closes it
83- void Disconnect (Multiplexer * data , int clientSocketFd ) {
124+ void Disconnect (Multiplexer * data , int clientSocketFd )
125+ {
84126 pthread_mutex_lock (data -> clientListMutex );
85- for (int i = 0 ; i < MAX_BUFFER ; i ++ ) {
86- if ((data -> conn )-> clientSockets [i ] == clientSocketFd ) {
127+ for (int i = 0 ; i < MAX_BUFFER ; i ++ )
128+ {
129+ if ((data -> conn )-> clientSockets [i ] == clientSocketFd )
130+ {
87131 (data -> conn )-> clientSockets [i ] = 0 ;
88132 close (clientSocketFd );
89133 (data -> conn )-> numClients -- ;
0 commit comments