Example #1
0
void Attack_ver2(const int fd) {
    /*
    サーバーを落とすのではなく、高負荷をかけるための関数。
    目的がサーバーのsegmentation faultではないので、
    readも同時に行う。
    毎ターン自分のリクエストが終わった時点で使用することを想定。
    */

    int len = -1;
    int total_read = 0;

    uint32_t tmp;
    uint32_t buf[22];

    while (1) {

        for (int i = 0; i < 4; i++) {
          len = -1;
          tmp = randomHash();
          while (len == -1) {
            len = write(fd, &tmp, sizeof(tmp));
          }
          printf("%d th time: Attacking %d byte\n", i, len);
        }

        for (int i = 0; i < DATA_NUM; i++) {
            len = -1;
            while (len <= 0) {
                len = read(fd, &tmp, sizeof(tmp));
            }
            buf[i] = tmp;
            total_read += len;
            if (i == 1 && ntohl(tmp) == GAME_END) {
                for (int j = 1; j <= 2; j++) {
                    len = -1;
                    while (len <= 0) {
                        len = read(fd, &tmp, sizeof(tmp));
                    }
                    buf[i+j] = tmp;
                    total_read += len;
                }
                break;
            }
        }
        if (getCode(buf) == TURN_START) {
            break;
        }
    }

}
Example #2
0
void Attack (const int fd) {
    /*
    サーバーを落とすための関数。
    連続で複数回writeすることでsegmentation faultを引き起こす
    平均20000~30000回のwriteで落ちる模様
    なお、2013/7/18時点でサーバー対応済み
    */

    uint32_t tmp;

    int len = -1;

    for (int i = 0; i < 1000000; i++) {
      len = -1;
      tmp = randomHash();
      while (len == -1) {
        len = write(fd, &tmp, sizeof(tmp));
      }
      printf("%d th time: Attacking %d byte\n", i, len);
    }

}
Example #3
0
int main(int argc, char *argv[]) {
	if (argv[1] == NULL) {
		puts("missing parameters");
		return 0;
	}
	char service[100];
	int fd[USER_NUM + 2];
	fd_set fdsets;
	uint32_t request[4];
	uint32_t response[22];
	int i,j,k,n;
	int error;

	strcpy(service, argv[1]);
	
	fd[0] = makesock(service);

	if (fd[0] < 0) {
		printf("unable to create socket, connection, or binding %i\n", fd[0]);
		return 0;
	}
	printf("binding success! sock: %i\n", fd[0]);
	
	error = listen(fd[0], USER_NUM);
	if (error < 0) {
		fprintf(stderr,"unable to listen error: %s(%d)\n", gai_strerror(error), error);
		return 0;
	}
	printf("listen success!\n");

	for(i=1;i<USER_NUM+2;i++) {
		fd[i] = -1;
	}
	//int msg_length, n;

	int sockCount = 1;
	srand((unsigned)time(NULL));
	struct timeval tv;
	time_t timer;
	struct sockaddr_storage ss;
	timer = time(NULL);
	socklen_t sl;
	sl = sizeof(ss);

	while(sockCount <= USER_NUM)
	{
		FD_ZERO(&fdsets);
		tv.tv_sec = 0;
		tv.tv_usec = 10;
		for (i=0; i<sockCount; i++) {
			if (fd[i] != (-1)) {
				FD_SET(fd[i], &fdsets);
			}
		}

		if ((n = select(FD_SETSIZE, &fdsets, NULL, NULL, &tv)) == -1) {
			printf("error in select");
		}

		if (FD_ISSET(fd[0], &fdsets) != 0) {
			printf("adding new user. current user count: %d\n", sockCount);
			fd[sockCount] = accept(fd[0], (struct sockaddr *)&ss, &sl);
			if (fd[sockCount] < 0) {
				fprintf(stderr,"socket error: %s(%d)\n", gai_strerror(fd[sockCount]), fd[sockCount]);
			}
			printf("new user accepted: %d\n", sockCount);
			sockCount++;
		}
	}

	timer = time(NULL);
	int turn = 0;

	struct gamePlayer players[USER_NUM];
	struct company companies[COMPANY_NUM];

	for (i=0;i<COMPANY_NUM;i++) {
		companies[i].price = 50 + rand()%100;
	}

	for (i=0;i<USER_NUM;i++) {
		players[i].budget[0] = 10000;
		players[i].count = 0;
		players[i].key = randomHash();
		response[0] = players[i].key;
		response[1] = 0x00000000;
		for (k=0; k<COMPANY_NUM; k++) {
			players[i].tickets[k] = 0;
			players[i].purchase[k] = 0;
			players[i].sale[k] = 0;
			response[2*k+2] = k;
			response[2*k+3] = companies[k].price;
		}
		for (k=0; k<22; k++) {
			uint32_t tmp = htonl(response[k]);
			write(fd[i+1],&tmp,sizeof(tmp));
		}
	}

	for(;;)
	{	
		tv.tv_sec = 0;
		tv.tv_usec = 10;

		if (difftime(time(NULL), timer) > 1) {
			int company_p[COMPANY_NUM];
			for(i=0; i<COMPANY_NUM; i++) {
				company_p[i] = 0;
			}
			printf("15 seconds has passed\n");
			for (i=1; i<USER_NUM+1; i++) {
				if (fd[i] != (-1)) {
					if (FD_ISSET(fd[i], &fdsets)) {
						for (k=0; k<4; k++) {
							error = read(fd[i], &request[k], sizeof(request[k]));
							request[k] = ntohl(request[k]);
						}
						response[0] = request[0];
						for (k=0; k<COMPANY_NUM; k++) {
							response[2*k+2] = k;
							response[2*k+3] = 0x00000000;
						}

						response[1] = status(players[i-1], companies, request[0], request[1], request[2], request[3], turn);
						//printf("response code for user %d is %x\n", i-1, response[1]);

						if (response[1] == ACCEPT) {
							if(request[1] == PURCHASE) {
								players[i-1].purchase[request[2]] += request[3];
								printf("purchasing company id: %d (price: %d) quantity: %d\n",request[2], companies[request[2]].price, request[3]);
							} else {
								players[i-1].sale[request[2]] += request[3];
								printf("selling company id: %d (price: %d) quantity: %d\n",request[2], companies[request[2]].price, request[3]);
							}
							response[request[2]*2+3] = request[3];
						} else if (response[1] == ERR_PUR) {
							response[request[2]*2+3] = request[3];
							printf("!ERROR in purchasing company id: %d (price: %d) quantity: %d\nYour current budget is %d\n\n",request[2], companies[request[2]].price, request[3], players[i-1].budget[turn]);
						} else if (response[1] == ERR_SAL) {
							response[request[2]*2+3] = request[3];
							printf("!ERROR in selling company id: %d (price: %d) quantity: %d\nYou only have %d tickets\n\n",request[2], companies[request[2]].price, request[3], players[i-1].tickets[request[2]]);
						}

						for (k=0; k<22; k++) {
							uint32_t tmp = htonl(response[k]);
							write(fd[i],&tmp,sizeof(tmp));
						}
					}
				} else {
					printf("fd[%d] is -1\n", i);
				}
				k=0;
				printf("\n==== User ID: %d on Turn %d ====\n", i-1, turn);
				for(j=0; j<COMPANY_NUM; j++) {
					printf("company id: %d\npurchasing %d tickets, selling %d tickets\n BEFORE: %d tickets left", j, players[i-1].purchase[j], players[i-1].sale[j], players[i-1].tickets[j]);
					k += (players[i-1].purchase[j] - players[i-1].sale[j]) * companies[j].price;
					//purchase 
					players[i-1].tickets[j] += players[i-1].purchase[j];
					company_p[j] += players[i-1].purchase[j];
					players[i-1].purchase[j] = 0;
					//sale
					players[i-1].tickets[j] -= players[i-1].sale[j];
					company_p[j] -= players[i-1].sale[j];
					players[i-1].sale[j] = 0;
					printf(" AFTER: %d tickets left\n", players[i-1].tickets[j]);
				}
				printf("left over budget BEFORE: %d and k: %d\n", players[i-1].budget[turn], k);
				players[i-1].budget[turn] -= k;
				//printf("left over budget %d\n======\n", players[i-1].budget[turn]);
				players[i-1].count = 0;
			}
			int addition = 0;
			for (k=0; k<COMPANY_NUM; k++) {
				addition += company_p[k];
			}
			if (addition == 0) {
				for (k=0; k<COMPANY_NUM; k++) {
					companies[k].price = companies[k].price - 5 + rand()%11;
				}
			} else {
				for (k=0; k<COMPANY_NUM; k++) {
					companies[k].price = companies[k].price - 5 + rand()%11 + companies[k].price/10*company_p[k]/addition;
				}
			}
			turn++;
			if (turn != 12*PLAY_YEARS) {
				for(i=0; i<USER_NUM; i++) {
					players[i].budget[turn] = players[i].budget[turn-1];
					players[i].key = randomHash();
					response[0] = players[i].key;
					response[1] = 0x00000000;
					for (k=0; k<COMPANY_NUM; k++) {
						response[2*k+2] = k;
						response[2*k+3] = companies[k].price;
					}
					for (k=0; k<22; k++) {
						uint32_t tmp = htonl(response[k]);
						write(fd[i+1], &tmp, sizeof(tmp));
					}
				}
				printf("=== TURN: %d ===\n", turn);
				for (k=0; k<COMPANY_NUM; k++) {
					response[2*k+2] = k;
					response[2*k+3] = companies[k].price;
					printf("%d : %i\n", k, companies[k].price);
				}
				printf("======\n");
			}
			timer = time(NULL);
		}
		if (turn == 12*PLAY_YEARS) {
			response[0] = 0x00000000;
			response[1] = 0x00000002;
			int rank[USER_NUM];
			int list[USER_NUM];
			int u;
			for (i=0; i<USER_NUM; i++) {
				list[i] = players[i].budget[turn-1];
			}
			for (i=0; i<USER_NUM; i++) {
				u = 0;
				for (j=0; j<USER_NUM; j++) {
					if (list[j] > list[u]) {
						u = j;
					}
				}
				list[u] = 0;
				rank[i] = u;
			}
			for (i=0; i<USER_NUM; i++) {
				j = 0;
				while(i != rank[j]) {
					j++;
				}
				response[2] = j+1;
				response[3] = players[i].budget[turn-1];
				for (k=0; k<4; k++) {
					uint32_t tmp = htonl(response[k]);
					write(fd[i+1],&tmp,sizeof(tmp));
				}
			}
			break;
		}
		FD_ZERO(&fdsets);
		for (i=0; i<USER_NUM+1; i++) {
			if (fd[i] != (-1)) {
				FD_SET(fd[i], &fdsets);
			}
		}

		if ((n = select(FD_SETSIZE, &fdsets, NULL, NULL, &tv)) == -1) {
			printf("error in select");
		}

		if (FD_ISSET(fd[0], &fdsets) != 0) {
			fd[USER_NUM+1] = accept(fd[0], (struct sockaddr *)&ss, &sl);
			printf("too many user has tried to connect\n");
			close(fd[USER_NUM+1]);
		}

		for (i=1; i<USER_NUM+1; i++) {
			if (fd[i] != (-1)) {
				if (FD_ISSET(fd[i], &fdsets)) {
					//printf("fd[%d] ready for read\n", i);
					for (k=0; k<4; k++) {
						read(fd[i], &request[k], sizeof(request[k]));
						request[k] = ntohl(request[k]);
					}

					response[0] = request[0];
					for (k=0; k<COMPANY_NUM; k++) {
						response[2*k+2] = k;
						response[2*k+3] = 0x00000000;
					}

					response[1] = status(players[i-1], companies, request[0], request[1], request[2], request[3], turn);
					//printf("response code for user %d is %x\n", i-1, response[1]);

					if (response[1] == ACCEPT) {
						if(request[1] == PURCHASE) {
							players[i-1].purchase[request[2]] += request[3];
							printf("purchasing company id: %d (price: %d) quantity: %d\n",request[2], companies[request[2]].price, request[3]);
						} else {
							players[i-1].sale[request[2]] += request[3];
							printf("selling company id: %d (price: %d) quantity: %d\n",request[2], companies[request[2]].price, request[3]);
						}
						response[request[2]*2+3] = request[3];
					} else if (response[1] == ERR_PUR) {
						response[request[2]*2+3] = request[3];
						printf("!ERROR in purchasing company id: %d (price: %d) quantity: %d\nYour current budget is %d\n\n",request[2], companies[request[2]].price, request[3], players[i-1].budget[turn]);
					} else if (response[1] == ERR_SAL) {
						response[request[2]*2+3] = request[3];
						printf("!ERROR in selling company id: %d (price: %d) quantity: %d\nYou only have %d tickets\n\n",request[2], companies[request[2]].price, request[3], players[i-1].tickets[request[2]]);
					}

					for (k=0; k<22; k++) {
						uint32_t tmp = htonl(response[k]);
						write(fd[i],&tmp, sizeof(tmp));
					}

					players[i-1].count++;
				}
			} else {
				printf("fd[%d] is -1\n", i);
			}
		}						
	}
	printf("connection finished!\n");
	return 0;
}