psalias Δημοσ. 16 Νοεμβρίου 2008 Δημοσ. 16 Νοεμβρίου 2008 Νέος στο άθλημα θέλω μια μικρή βοήθεια σε κώδικα πως να βάλω 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...
pinball_elf Δημοσ. 17 Νοεμβρίου 2008 Δημοσ. 17 Νοεμβρίου 2008 >/* 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; }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.