Προς το περιεχόμενο

TCP server fork() help lang:C


psalias

Προτεινόμενες αναρτήσεις

Δημοσ.

Νέος στο άθλημα θέλω μια μικρή βοήθεια σε κώδικα πως να βάλω fork() έτσι ώστε να δέχεται πάνω από ένα client ταυτόχρονα

 

TCPserver

 

>/* tcpserver.c */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>


int main()
{
       int sock, connected, bytes_recieved , true = 1;  
       char send_data [1024] , recv_data[1024];       

       struct sockaddr_in server_addr,client_addr;    
       int sin_size;
       
       if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
           perror("Socket");
           exit(1);
       }

       if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)) == -1) {
           perror("Setsockopt");
           exit(1);
       }
       
       server_addr.sin_family = AF_INET;         
       server_addr.sin_port = htons(5000);     
       server_addr.sin_addr.s_addr = INADDR_ANY; 
       bzero(&(server_addr.sin_zero),8); 

       if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))
                                                                      == -1) {
           perror("Unable to bind");
           exit(1);
       }

       if (listen(sock, 5) == -1) {
           perror("Listen");
           exit(1);
       }
	
printf("\nTCPServer Waiting for client on port 5000");
       fflush(stdout);


       while(1)
       {  

           sin_size = sizeof(struct sockaddr_in);

           connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size);

           printf("\n I got a connection from (%s , %d)",
                  inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));

           while (1)
           {
             printf("\n SEND (q or Q to quit) : ");
             gets(send_data);
             
             if (strcmp(send_data , "q") == 0 || strcmp(send_data , "Q") == 0)
             {
               send(connected, send_data,strlen(send_data), 0); 
               close(connected);
               break;
             }
              
             else
                send(connected, send_data,strlen(send_data), 0);  

             bytes_recieved = recv(connected,recv_data,1024,0);

             recv_data[bytes_recieved] = '\0';

             if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0)
             {
               close(connected);
               break;
             }

             else 
             printf("\n RECIEVED DATA = %s " , recv_data);
             fflush(stdout);
           }
       }       

     close(sock);
     return 0;
} 

 

Αν θέλετε μπορώ να ποστάρω και τον κώδικα του client...

Δημοσ.
>/* tcpserver.c */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>


int main()
{
       int sock, connected, bytes_recieved , true = 1;  
       char send_data [1024] , recv_data[1024];       
       [color="Red"]pid_t pid;[/color]
       struct sockaddr_in server_addr,client_addr;    
       int sin_size;
       
       if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
           perror("Socket");
           exit(1);
       }

       if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)) == -1) {
           perror("Setsockopt");
           exit(1);
       }
       
       server_addr.sin_family = AF_INET;         
       server_addr.sin_port = htons(5000);     
       server_addr.sin_addr.s_addr = INADDR_ANY; 
       bzero(&(server_addr.sin_zero),8); 

       if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))
                                                                      == -1) {
           perror("Unable to bind");
           exit(1);
       }

       if (listen(sock, 5) == -1) {
           perror("Listen");
           exit(1);
       }
	
printf("\nTCPServer Waiting for client on port 5000");
       fflush(stdout);


       while(1)
       {  

           sin_size = sizeof(struct sockaddr_in);

           connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size);

           printf("\n I got a connection from (%s , %d)",
                  inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
[color="Red"]            if ((pid = fork ()) < 0 )
           {
             perror("fork()");
             exit (-1);
           }
           else if (pid == 0) /* child */
           {
           int my_connected = connected;[/color]
           while (1)
           {
             printf("\n SEND (q or Q to quit) : ");
             gets(send_data);
             
             if (strcmp(send_data , "q") == 0 || strcmp(send_data , "Q") == 0)
             {
               send([color="Red"]my_connected[/color], send_data,strlen(send_data), 0); 
               close([color="Red"]my_connected[/color]);
               [color="Red"]exit (1);[/color]
             }
              
             else
                send([color="Red"]my_connected[/color], send_data,strlen(send_data), 0);  

             bytes_recieved = recv([color="Red"]my_connected[/color],recv_data,1024,0);

             recv_data[bytes_recieved] = '\0';

             if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0)
             {
               close([color="Red"]my_connected[/color]);
               [color="Red"]exit (1);[/color]
             }

             else 
             printf("\n RECIEVED DATA = %s " , recv_data);
             fflush(stdout);
           }
           [color="Red"]}[/color]
       }       

     close(sock);
     return 0;
} 

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...