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; } } }
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); } }
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; }