- #include <netdb.h>
- #include <netinet/in.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/socket.h>
- #include <sys/types.h>
- #include <signal.h>
- #define SA struct sockaddr
- #define MAX 80
- typedef struct token{
- int destPortNumber;
- int sourcePortNumber;
- }Token;
- typedef struct message{
- int destPortNumber;
- int sourcePortNumber;
- // string text;
- // bool ifDelivered;
- }Message;
- int connfd;
- char buff[MAX];
- int sockfd,sockfd2,connfd2,internalIn,internalOut,internalConnfd,mcastSocketfd;
- int SELF_PORT,PREV_PORT,MCAST_PORT;
- void sendToken()
- {
- char buff[MAX];
- char* text = "token\n";
- for(int i = 0; i<strlen(text); i++){
- buff[i] = text[i];
- }
- char addresBuff[4];
- int address;
- read(internalConnfd, buff, sizeof(buff));
- if(strncmp(buff,"token\n",5) == 0){
- printf("Do you want to send message?(y/n)\n");
- if(getchar() == 'y' || getchar() == 'Y'){
- printf("Enter message?\n");
- getchar();
- int n = 0;
- while ((buff[n++] = getchar()) != '\n')
- ;
- }
- }
- if(strncmp(buff,"message",6) == 0){
- for(int i=0;i<4;i++){
- addresBuff[i] = buff[8+i];
- }
- address = atoi(addresBuff);
- printf("Adress: = %d\n",address);
- if(address == SELF_PORT){
- printf("I got message! %s",buff);
- char* text = "token\n";
- for(int i = 0; i<strlen(text); i++){
- buff[i] = text[i];
- }
- }
- }
- write(connfd, buff, sizeof(buff));
- printf("Token send! %s here\n",buff);
- sleep(4);
- if (strncmp("exit", buff, 4) == 0) {
- printf("Server Exit...\n");
- // break;
- }
- }
- void sendToken2()
- {
- //char buff[MAX];
- printf("Do you want to send message?(y/n)\n");
- if(getchar() == 'y' || getchar() == 'Y'){
- printf("Enter message: ");
- bzero(buff, MAX);
- int n = 0;
- getchar();
- while ((buff[n++] = getchar()) != '\n')
- ;
- printf("Message end! \n");
- }
- else{
- char* text = "token\n";
- for(int i = 0; i<strlen(text); i++){
- buff[i] = text[i];
- }
- }
- sleep(2);
- write(connfd, buff, sizeof(buff));
- printf("Token send!\n");
- if (strncmp("exit", buff, 4) == 0) {
- printf("Server Exit...\n");
- // break;
- }
- }
- void func2(int sockfd)
- {
- char buff[MAX];
- int n;
- for (;;) {
- bzero(buff, sizeof(buff));
- read(sockfd, buff, sizeof(buff));
- printf("I got : %s", buff);
- if ((strncmp(buff, "exit", 4)) == 0) {
- printf("Client Exit...\n");
- break;
- }
- }
- sleep(2);
- }
- closeSockets(){
- close(sockfd);
- close(sockfd2);
- close(connfd);
- }
- int main(int argc, char *argv[]) {
- // signal(SIGINT,closeSockets());
- MCAST_PORT = 3000;
- if(argc != 6){
- printf("Improper arguments number!\n");
- return -1;
- }
- //const char ID = argv[0];
- SELF_PORT = atoi(argv[2]);
- PREV_PORT = atoi(argv[3]);
- const int INTERNAL_PORT = 10000+getpid();
- int hasToken = atoi(argv[4]);
- char buffer[1024] = {0};
- struct sockaddr_in self_address;
- printf("Port is %s \n",argv[2]);
- // server side
- int len;
- struct sockaddr_in servaddr, cli;
- struct sockaddr_in internaladdrIn;
- struct sockaddr_in internaladdrIn2;
- struct sockaddr_in internaladdrOut;
- struct sockaddr_in mcast;
- // client side
- struct sockaddr_in prev_servaddr, cli2;
- ////
- pid_t child_pid,parent_pid;
- parent_pid = getpid();
- child_pid = fork();
- if(child_pid!=0) { // parent
- // socket for communication with succesor
- signal(SIGUSR1,sendToken);
- sockfd = socket(AF_INET, SOCK_STREAM, 0);
- if (sockfd == -1) {
- printf("socket creation failed...\n");
- exit(0);
- }
- else
- printf("Socket successfully created..\n");
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- servaddr.sin_port = htons(SELF_PORT);
- if ((bind(sockfd, (SA*)&servaddr, sizeof(servaddr))) != 0) {
- printf("socket bind failed...\n");
- exit(0);
- }
- else
- printf("Socket successfully binded..\n");
- if ((listen(sockfd, 5)) != 0) {
- printf("Listen failed...\n");
- exit(0);
- }
- else
- printf("Server listening..\n");
- len = sizeof(cli);
- connfd = accept(sockfd, (SA*)&cli, &len);
- if (connfd < 0) {
- printf("server acccept failed...\n");
- exit(0);
- }
- else
- printf("server acccept the client...\n");
- // internal connection:
- printf("Here is beginnig!");
- internalIn = socket(AF_INET, SOCK_STREAM, 0);
- if (internalIn == -1) {
- printf("socket creation failed...\n");
- exit(0);
- }
- bzero(&internaladdrIn2, sizeof(internaladdrIn2));
- internaladdrIn2.sin_family = AF_INET;
- internaladdrIn2.sin_addr.s_addr = htonl(INADDR_ANY);
- internaladdrIn2.sin_port = htons(INTERNAL_PORT);
- if ((bind(internalIn, (SA*)&internaladdrIn2, sizeof(internaladdrIn2))) != 0) {
- printf("socket bind failed...\n");
- exit(0);
- }
- if ((listen(internalIn, 5)) != 0) {
- printf("Listen failed...\n");
- exit(0);
- }
- int len2 = sizeof(internaladdrOut);
- internalConnfd = accept(internalIn, (SA*)&internaladdrOut, &len2);
- if (internalConnfd < 0) {
- printf("server acccept failed...\n");
- exit(0);
- }
- printf("Here is ok! \n");
- // end of internal connection
- if(hasToken == 1)
- sendToken2();
- for(;;){
- // printf("sender waiting! \n");
- }
- // After chatting close the socket
- close(sockfd);
- } else { // child
- sockfd2 = socket(AF_INET, SOCK_STREAM, 0);
- if (sockfd2 == -1) {
- printf("socket creation failed...\n");
- exit(0);
- }
- else
- printf("Socket successfully created..\n");
- bzero(&prev_servaddr, sizeof(prev_servaddr));
- // assign IP, PORT
- prev_servaddr.sin_family = AF_INET;
- prev_servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
- prev_servaddr.sin_port = htons(PREV_PORT);
- // connect the client socket to server socket
- while (connect(sockfd2, (SA*)&prev_servaddr, sizeof(prev_servaddr)) != 0) {
- printf("connection with the server failed...\n");
- printf("Trying again");
- sleep(1);
- }
- //internal connection
- internalOut = socket(AF_INET, SOCK_STREAM, 0);
- if (internalOut == -1) {
- printf("socket creation failed...\n");
- exit(0);
- }
- else
- //printf("Socket successfully created..\n");
- bzero(&internaladdrIn, sizeof(internaladdrIn));
- // assign IP, PORT
- internaladdrIn.sin_family = AF_INET;
- internaladdrIn.sin_addr.s_addr = inet_addr("127.0.0.1");
- internaladdrIn.sin_port = htons(INTERNAL_PORT);
- // connect the client socket to server socket
- while (connect(internalOut, (SA*)&internaladdrIn, sizeof(internaladdrIn)) != 0) {
- printf("connection with the server failed...\n");
- printf("Trying again");
- sleep(1);
- }
- //end of internal connection
- // multicast socket
- mcastSocketfd = socket(AF_INET, SOCK_DGRAM, 0);
- if (mcastSocketfd == -1) {
- printf("socket creation failed...\n");
- exit(0);
- }
- memset(&mcast,0, sizeof(mcast));
- // assign IP, PORT
- mcast.sin_family = AF_INET;
- mcast.sin_addr.s_addr = inet_addr("127.0.0.1");
- mcast.sin_port = htons(MCAST_PORT);
- // end of multicast socekt
- int n;
- for (;;) {
- read(sockfd2, buff, sizeof(buff));
- sendto(mcastSocketfd, buff, sizeof(buff),
- 0, (const struct sockaddr *) &mcast,
- sizeof(mcast));
- printf("Pewnie już poszło! :)");
- printf("I got: %s", buff);
- if((strncmp(buff, "token\n", 4)) == 0 || (strncmp(buff, "message", 4)) == 0 ){
- write(internalOut, buff, sizeof(buff));
- kill(getppid(),SIGUSR1);
- printf("I know what i get! \n");
- }
- else if ((strncmp(buff, "exit", 4)) == 0) {
- printf("Client Exit...\n");
- break;
- }
- else{
- printf("I don't know what I get :( \n");
- }
- sleep(2);
- }
- }
- return 0;
- }