#include #include #include #include #include #include ssize_t readline(int fd, void *vptr, size_t max) { ssize_t n, rc; char c, *ptr; ptr = vptr; for (n = 1; n < max; n++) { if ( (rc = read(fd, &c, 1)) == 1) { *ptr++ = c; if (c == 13) { break; } } else if (rc == 0) { *ptr = 0; return (n - 1); } } *ptr = 0; return (n); } void ClientHandlerTCP(int clientSocket) { char username[256]; char msg[100]; int unl = readline(clientSocket, username, 256); printf("A: asked for %s\n", username); sprintf(msg, "YES"); int sl = strlen(msg); if (sl == (write(clientSocket, msg, sl))) printf("A: User logged in sent\n"); else printf("A: something went wrong"); } void ClientHandlerUDP(int clientSocket) { char msg[100]; sprintf(msg, "%d", 10); int sl = strlen(msg); if (sl == (write(clientSocket, msg, sl))) printf("B: Number of users sent\n"); else printf("B: something went wrong"); } void handleSocketTCP(int clientSocketTCP) { struct sockaddr_in newClient; int clientLength, newSocket, clientSocket; pid_t childpid; printf("TCP - listen\n"); listen(clientSocketTCP,5); for(;;) { clientLength = sizeof(newClient); printf("TCP - accept\n"); newSocket = accept(clientSocketTCP,(struct sockaddr *) &newClient,&clientLength); printf("TCP - accepted\n"); if ((childpid=fork())==0) { printf("TCP - fork\n"); close(clientSocket); printf("TCP - handler started\n"); ClientHandlerTCP(newSocket); printf("TCP - handler finished\n"); exit(0); continue; } else close(newSocket); } printf("TCP server socket finished\n"); } void handleSocketUDP(int clientSocketUDP) { struct sockaddr_in newClient; int newSocket, clientSocket; int monitorLen; char buffer[20]; pid_t childpid; for(;;) { struct sockaddr_in newMonitor; monitorLen = sizeof(newMonitor); int length = recvfrom(clientSocket, buffer, 10, 0, (struct sockaddr*) &newMonitor,&monitorLen); if ((childpid=fork())==0) { printf("Client B handler forked\n"); close(clientSocket); printf("Client B handler running...\n"); ClientHandlerUDP(newSocket); printf("Client B handler done.\n"); exit(0); continue; } else close(newSocket); } printf("Server socket B handler done\n"); } int main(int argc, char **argv) { int clientSocketTCP, clientSocketUDP; struct sockaddr_in clisinTCP,clisinUDP,monsin,newClient,newmon; int monport,port; fd_set fdvar; pid_t serverTCP, serverUDP; port = 7009; if ((clientSocketTCP = socket(AF_INET,SOCK_STREAM,0)) <0){ perror("sv : client socket error\n"); exit(1); } memset(&clisinTCP,0,sizeof(clisinTCP)); clisinTCP.sin_family = AF_INET; clisinTCP.sin_addr.s_addr = htonl(INADDR_ANY); clisinTCP.sin_port = htons(port); if (bind(clientSocketTCP,(struct sockaddr*)&clisinA,sizeof(clisinTCP))<0 ){ perror("sv : client socket bind error \n"); exit(3); } if ((serverTCP = fork())==0) { printf("serverA forked\n"); handleSocketTCP(clientSocketTCP); printf("serverA done its job\n"); } port = 8099; if ((clientSocketUDP = socket(AF_INET,SOCK_DGRAM,0)) <0){ perror("B : client socket error\n"); exit(1); } memset(&clisinUDP,0,sizeof(clisinUDP)); clisinUDP.sin_family = AF_INET; clisinUDP.sin_addr.s_addr = htonl(INADDR_ANY); clisinUDP.sin_port = htons(port); if (bind(clientSocketUDP,(struct sockaddr*)&clisinUDP,sizeof(clisinUDP))<0 ){ perror("B : client socket bind error \n"); exit(3); } if ((serverUDP = fork())==0) { printf("serverUDP forked\n"); handleSocketUDP(clientSocketUDP); printf("serverUDP done its job\n"); } int i = 2; int status = 0; while (i > 0) { wait(&status); i--; } return 0; }