├── README.md ├── Send_Structure_for_Authentication_Client ├── Send_Structure_for_Authentication_Server ├── tcpClient.c └── tcpServer.c /README.md: -------------------------------------------------------------------------------- 1 | # Multiple-Client-Server-Program-in-C-using-fork 2 | A simple tcp client server application that describes the communication between the client and a server. The server is a simple echo sever that can handle multiple client using fork. 3 | 4 | An echo server is a server that send back the same message that the client has send the server. 5 | Like: 6 | 7 | Client send - abc
8 | Server recv - abc 9 | -------------------------------------------------------------------------------- /Send_Structure_for_Authentication_Client: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | struct myStruct{ 8 | char name[10]; 9 | int userId; 10 | char password[10]; 11 | }; 12 | int main(){ 13 | int sockfd; 14 | struct sockaddr_in server; 15 | sockfd = socket(AF_INET, SOCK_STREAM, 0); 16 | if(sockfd==-1){ 17 | printf("Socket not created\n"); 18 | exit(0); 19 | }else{ 20 | printf("Socket Created\n"); 21 | } 22 | server.sin_family = AF_INET; 23 | server.sin_port = htons(3050); 24 | server.sin_addr.s_addr = INADDR_ANY; 25 | 26 | 27 | int x=connect(sockfd, (struct sockaddr *)&server, sizeof(server)); 28 | if(x==-1){ 29 | printf("Connection Failure\n"); 30 | exit(0); 31 | } 32 | 33 | struct myStruct myst; 34 | printf("Enter userId : "); 35 | scanf("%d",&myst.userId); 36 | printf("Enter password : "); 37 | scanf("%s",myst.password); 38 | 39 | 40 | send(sockfd,&myst,sizeof(myst),0); 41 | 42 | char message[20]; 43 | recv(sockfd, message, sizeof(message), 0); 44 | 45 | printf("%s",message); 46 | 47 | 48 | close(sockfd); 49 | return 0; 50 | } 51 | -------------------------------------------------------------------------------- /Send_Structure_for_Authentication_Server: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | struct myStruct{ 8 | char name[10]; 9 | int userId; 10 | char password[10]; 11 | }; 12 | int main(){ 13 | int sockfd; 14 | struct sockaddr_in server,client; 15 | 16 | sockfd = socket(AF_INET, SOCK_STREAM, 0); 17 | if(sockfd==-1){ 18 | printf("Socket not created\n"); 19 | exit(0); 20 | }else{ 21 | printf("Socket Created\n"); 22 | } 23 | 24 | server.sin_family = AF_INET; 25 | server.sin_port = htons(3050); 26 | server.sin_addr.s_addr = INADDR_ANY; 27 | //INET_ADDR("127.0.0.1") 28 | int x=bind(sockfd, (struct sockaddr *)&server, sizeof(server)); 29 | if(x==-1){ 30 | printf("bind Failure\n"); 31 | exit(0); 32 | }else{ 33 | printf("bind Successful\n"); 34 | } 35 | 36 | listen(sockfd, 5); 37 | int s=sizeof(client); 38 | 39 | struct myStruct st[5]={{"nikhil1",1,"nikhil1"}, 40 | {"nikhil2",2,"nikhil2"}, 41 | {"nikhil3",3,"nikhil3"}, 42 | {"nikhil14",4,"nikhil4"}, 43 | {"nikhil5",5,"nikhil15"}}; 44 | struct myStruct myst; 45 | int fd1=accept(sockfd, (struct sockaddr *)&client, &s); 46 | 47 | recv(fd1, &myst, sizeof(myst), 0); 48 | //recvfrom(sockfd,buff,100,0,(struct sockaddr *)&client,&s); 49 | 50 | printf("userId received :%d\n",myst.userId); 51 | printf("password received :%s\n",myst.password); 52 | int fl=1; 53 | for(int i=0;i<5;i++){ 54 | if(myst.userId==st[i].userId && strcmp(myst.password,st[i].password)==0){ 55 | fl=0; 56 | break; 57 | } 58 | } 59 | 60 | 61 | if(fl==0){ 62 | char message[20]="Login Successful\n"; 63 | send(fd1, message, sizeof(message), 0); 64 | }else{ 65 | char message[20]="Login Failure\n"; 66 | send(fd1, message, sizeof(message), 0); 67 | } 68 | 69 | 70 | close(sockfd); 71 | return 0; 72 | } 73 | -------------------------------------------------------------------------------- /tcpClient.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #define PORT 4444 11 | 12 | int main(){ 13 | 14 | int clientSocket, ret; 15 | struct sockaddr_in serverAddr; 16 | char buffer[1024]; 17 | 18 | clientSocket = socket(AF_INET, SOCK_STREAM, 0); 19 | if(clientSocket < 0){ 20 | printf("[-]Error in connection.\n"); 21 | exit(1); 22 | } 23 | printf("[+]Client Socket is created.\n"); 24 | 25 | memset(&serverAddr, '\0', sizeof(serverAddr)); 26 | serverAddr.sin_family = AF_INET; 27 | serverAddr.sin_port = htons(PORT); 28 | serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 29 | 30 | ret = connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)); 31 | if(ret < 0){ 32 | printf("[-]Error in connection.\n"); 33 | exit(1); 34 | } 35 | printf("[+]Connected to Server.\n"); 36 | 37 | while(1){ 38 | printf("Client: \t"); 39 | scanf("%s", &buffer[0]); 40 | send(clientSocket, buffer, strlen(buffer), 0); 41 | 42 | if(strcmp(buffer, ":exit") == 0){ 43 | close(clientSocket); 44 | printf("[-]Disconnected from server.\n"); 45 | exit(1); 46 | } 47 | 48 | if(recv(clientSocket, buffer, 1024, 0) < 0){ 49 | printf("[-]Error in receiving data.\n"); 50 | }else{ 51 | printf("Server: \t%s\n", buffer); 52 | } 53 | } 54 | 55 | return 0; 56 | } -------------------------------------------------------------------------------- /tcpServer.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #define PORT 4444 11 | 12 | int main(){ 13 | 14 | int sockfd, ret; 15 | struct sockaddr_in serverAddr; 16 | 17 | int newSocket; 18 | struct sockaddr_in newAddr; 19 | 20 | socklen_t addr_size; 21 | 22 | char buffer[1024]; 23 | pid_t childpid; 24 | 25 | sockfd = socket(AF_INET, SOCK_STREAM, 0); 26 | if(sockfd < 0){ 27 | printf("[-]Error in connection.\n"); 28 | exit(1); 29 | } 30 | printf("[+]Server Socket is created.\n"); 31 | 32 | memset(&serverAddr, '\0', sizeof(serverAddr)); 33 | serverAddr.sin_family = AF_INET; 34 | serverAddr.sin_port = htons(PORT); 35 | serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 36 | 37 | ret = bind(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr)); 38 | if(ret < 0){ 39 | printf("[-]Error in binding.\n"); 40 | exit(1); 41 | } 42 | printf("[+]Bind to port %d\n", 4444); 43 | 44 | if(listen(sockfd, 10) == 0){ 45 | printf("[+]Listening....\n"); 46 | }else{ 47 | printf("[-]Error in binding.\n"); 48 | } 49 | 50 | 51 | while(1){ 52 | newSocket = accept(sockfd, (struct sockaddr*)&newAddr, &addr_size); 53 | if(newSocket < 0){ 54 | exit(1); 55 | } 56 | printf("Connection accepted from %s:%d\n", inet_ntoa(newAddr.sin_addr), ntohs(newAddr.sin_port)); 57 | 58 | if((childpid = fork()) == 0){ 59 | close(sockfd); 60 | 61 | while(1){ 62 | recv(newSocket, buffer, 1024, 0); 63 | if(strcmp(buffer, ":exit") == 0){ 64 | printf("Disconnected from %s:%d\n", inet_ntoa(newAddr.sin_addr), ntohs(newAddr.sin_port)); 65 | break; 66 | }else{ 67 | printf("Client: %s\n", buffer); 68 | send(newSocket, buffer, strlen(buffer), 0); 69 | bzero(buffer, sizeof(buffer)); 70 | } 71 | } 72 | } 73 | 74 | } 75 | 76 | close(newSocket); 77 | 78 | 79 | return 0; 80 | } --------------------------------------------------------------------------------