?? server.c
字號:
/* A simple server in the internet domain using TCP The port number is passed as an argument */#include <stdio.h>#include <sys/types.h> #include <sys/socket.h>#include <netinet/in.h>#include <firewall.h>#include <server.h>#include <stdlib.h>#include <string.h>#include <unistd.h>struct FirewallConfig *firewallTable = NULL; /* global table */void error(char *msg){ perror(msg); exit(1);}int main(int argc, char *argv[]){ int sockfd, newsockfd, portno; socklen_t clilen; int errno; char buffer[BUFFERLENGTH]; char result; struct sockaddr_in serv_addr, cli_addr; int n; if (argc < 2) { fprintf(stderr,"ERROR, no port provided\n"); exit(1); } sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) error("ERROR opening socket"); bzero((char *) &serv_addr, sizeof(serv_addr)); portno = atoi(argv[1]); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) error("ERROR on binding"); listen(sockfd,5); clilen = sizeof(cli_addr); while (1) { newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) error("ERROR on accept"); bzero(buffer, BUFFERLENGTH); n = read(newsockfd,buffer, BUFFERLENGTH -1); if (n < 0) error("ERROR reading from socket"); switch (buffer[0]) { case ADD_RULE: firewallTable = addRule (buffer + 1, firewallTable, &errno); buffer[0] = errno; n = write (newsockfd, buffer, 1); if (n < 0) error ("Error writing to socket"); break; case SHOW_TABLE: showTable (firewallTable); break; case CHECK_ENTRY: result = checkEntry (buffer +1, firewallTable, &errno); if (errno != 0) { buffer[0] = errno; } else { buffer[0] = result; } n = write (newsockfd, buffer, 1); if (n < 0) error ("Error writing to socket"); break; default: fprintf (stderr, "Illegal request received: %c\n", buffer[0]); } close (newsockfd); } return 0; }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -